Метод модульного тестирования, который вызывает только один метод зависимости - c # / xUnit / Moq - PullRequest
0 голосов
/ 31 августа 2018

Стыдно признаться, но юнит-тестирование для меня все еще ново. Я довольно твердо понимаю, как правильно обращаться с вещами. Но ситуация, которую мне трудно понять, заключается в написании модульного теста для метода, который просто возвращает результат вызова метода зависимости.

Я обнаружил, что он возникал несколько раз в ситуациях, когда вы внедряете уровень обслуживания для взаимодействия со своим уровнем DAL.

Тривиальный пример кода, вероятно, будет лучше описывать то, что я спрашиваю.

Примечание. В приведенном ниже примере кода используются c #, xUnit и Moq .

.
public class Foo {
    Bar int;
    Baz string;
}

public interface IFooRepository {
    Foo GetByBar(bar int);
}

public interface IFooService {
    Foo GetByBar(bar int);
}

public class FooService : IFooService {
    private IFooRepository fooRepository;

    public FooService(
        IFooRepository fooRepository){
        this.fooRepository = fooRepository; 
    }

    public Foo GetByBar(bar int)
    {
        return fooRepository.GetByBar(bar);
    }
}

[Fact]
public class FooServiceTests 
{
    public class GetByBarMethod 
    {
        [Fact]
        public void ShouldReturnBar()
        {
            //arrange
            var expectedFoo = new Foo() { Bar = 1, Baz = "baz" };
            var repo = new Mock<IFooRepository>();
            repo.Setup(r => r.GetByBar(1)).Returns(expectedFoo);

            var service = new FooService(repo.Object);

            //act
            var result = service.GetByBar(1);

            //assert
            Assert.Same(result, expectedFoo);
        }
    }   
}

Я понимаю, что цель модульных тестов FooService заключается в проверке логики внутри методов, а не логики зависимостей. Так есть ли смысл писать тест в этом случае, если он просто тестирует возвращаемое значение макетной зависимости?

1 Ответ

0 голосов
/ 01 сентября 2018

Это ответ на ваш комментарий

Можете ли вы объяснить, как бы вы утверждали, что метод называется?

Есть два способа

Сначала нужно сделать Setup ожидание Verifiable()

repo
    .Setup(r => r.GetByBar(1))
    .Returns(expectedFoo)
    .Verifiable();

, а затем подтвердить его после вызова

//...code removed for brevity

//act
var result = service.GetByBar(1);

//assert
repo.Verify(); //Verifies that all verifiable expectations have been met.

Второй будет использовать выражение, подобное Setup в Verify

Например

//...code removed for brevity

//act
var result = service.GetByBar(1);

//assert
Assert.Same(result, expectedFoo);
repo.Verify(r => r.GetByBar(1));

Ссылка Moq Quickstart

...