Как использовать макет, который не передается реальному объекту - PullRequest
0 голосов
/ 29 марта 2020

У меня есть сервис CarTankService, как показано ниже. У него есть метод Add, который я хочу проверить. Чтобы быть более подробным, я хотел бы проверить, будет ли достигнут AddTank (inside Add).

public class CarTankService : ICarTankService
{
    private readonly ITankQuery _tankQuery;
    private readonly CarClient _carClient;

    public CarTankService(ITankQuery tankQuery)
    {
        _tankQuery = tankQuery;
        _carClient = new CarClient();
    }

    public ObservableCollection<CarTank> GetTanks() => _carClient.Tanks;

    public void GenerateNewList() => _carClient.GenerateNewTanksList();

    public virtual void Add(CarTank tank)
    {
        if (_tankQuery.isExist(tank.Number)) throw new OwnException()

        _carClient.AddTank(tank);
    }

    public virtual void Remove(CarTank tank) => _carClient.RemoveCarTank(tank);
}

Это мой класс метода тестирования:

[TestFixture]
class CarTankServiceTests
{
    private Mock<ITankQuery> TankQuery { get; set; }
    private ICarTankService CarTankService { get; set; }
    private Mock<CarClient> CarClient { get; set; }

    [SetUp]
    public void SetUp()
    {
        TankQuery = new Mock<ITankQuery>();
        CarClient = new Mock<CarClient>();
        CarTankService = new CarTankService(TankQuery.Object);
    }

    [Test]
    public void Add_NotExistReferenceNumber_AddTankReached()
    {
        TankQuery.Setup(uow => uow.isExist(It.IsAny<int>())).Returns(false);

        CarTankService.Add(new CarTank());

        CarClient.Verify(uow => uow.AddTank(It.IsAny<ClientTank>()),Times.Once);
    }
}

CarClient.Verify для AddTank всегда показывает, что в тесте было 0 occurence, что в данном случае неверно. Я не уверен, но я думаю, что это потому, что CarClient класс модели, потому что он не вводится напрямую. Insd ie мой сервис всегда показывает 0. AM Я прав? Есть ли возможность проверить это?

1 Ответ

1 голос
/ 29 марта 2020

Если вы издеваетесь над CarClient, вам необходимо настроить все методы, которые вы хотите использовать в своем тесте (здесь AddTank). В вашем коде у нас есть два экземпляра CarClient, один из которых проверяется в вашем тесте, а другой инициализируется в конструкторе CarTankService. Итак, вы вызываете последний случай при проверке поддельного.

Если вы преобразуете CarClient в интерфейс и внедряете его, решение будет примерно таким:

[TestFixture]
class CarTankServiceTests
{
    private Mock<ITankQuery> TankQuery { get; set; }
    private ICarTankService CarTankService { get; set; }
    private Mock<CarClient> CarClient { get; set; }

    [SetUp]
    public void SetUp()
    {
        TankQuery = new Mock<ITankQuery>();
        CarClient = new Mock<CarClient>();
        CarTankService = new CarTankService(TankQuery.Object);
    }

    [Test]
    public void Add_NotExistReferenceNumber_AddTankReached()
    {
        TankQuery.Setup(uow => uow.isExist(It.IsAny<int>())).Returns(false);

        CarTankService.Add(new CarTank());

        CarClient.Setup(a=>a.AddTank(/*write you loginc*/));
        CarClient.Verify(uow => uow.AddTank(It.IsAny<ClientTank>()),Times.Once);
    }
}

Вот еще одно объяснение:

Когда вы пишете CarTankService = new CarTankService(TankQuery.Object); в своем тесте, он создает новый экземпляр в вашем классе (_carClient = new CarClient();), поэтому у класса есть собственный экземпляр, в то время как у тестового класса тоже есть свой собственный (CarClient = new Mock<CarClient>();), который высмеивается. Эта строка кода CarTankService.Add(new CarTank()); добавляет резервуар к экземпляру класса, в то время как в вашем тесте вы проверяете экземпляр класса теста, у которого нет резервуара (CarClient.Verify(uow => uow.AddTank(It.IsAny<ClientTank>()),Times.Once);).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...