Почему вызывается конструктор класса Mocked, так как я указал return? - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь создать простой пример Moq для имитации класса, передающего конструктор:

string apiKey = "123";

Mock<YTAuthentication> authentication = new Mock<YTAuthentication>(apiKey);
authentication.Setup(p => p.ApiKey).Returns("123_c");
string toTest = authentication.Object.ApiKey;

Проблема в том, что он возвращает «123» вместо «123_c», я остановил конструктори я подтвердил, что его ударили

Вот высмеиваемый класс.

public class YTAuthentication : IYTAuthentication
{
    public virtual string ApiKey { get; }

    public YTAuthentication(string apiKey)
    {
        ApiKey = apiKey;
    }
}

public interface IYTAuthentication
{
    string ApiKey { get; }
}

Я думаю, что здесь не хватает какой-то концепции, но я не могу понять, что это такое

1 Ответ

0 голосов
/ 09 октября 2018

Вам не нужно передавать apiKey в качестве параметра для макета, вы можете просто сделать:

Mock<IYTAuthentication> authentication = new Mock<IYTAuthentication>(); // no arguments
authentication.Setup(p => p.ApiKey).Returns("123_c");
string toTest = authentication.Object.ApiKey;

Эта перегрузка Mock, которую вы вызываете, принимает массив объектов какпараметров и пытается инициализировать макет объекта с параметрами, которые вы передаете ему, который переопределяет настройку.

Редактировать:

Как указал @JonathonChase, вы неЕсли вам нужно смоделировать конкретную реализацию IYTAuthentication, вы можете просто сделать макеты из интерфейсов, которые будут выглядеть как анонимные объекты, которые реализуют целевой интерфейс.И если предположить, что ваш код следует хорошему принципу Инверсия зависимости , то можно с уверенностью предположить, что любая служба, которую вы пытаетесь протестировать, зависит не от конкретной YTAuthentication, а скорее от ее абстракции IYTAuthentication, поэтому, следуя этой хорошей практике, ваш модульный тест будет выглядеть так:

var authenticationMock = new Mock<IYTAuthentication>(); // no arguments

authenticationMock.Setup(p => p.ApiKey).Returns("123_c");

var service = new ServiceToTest(authenticationMock.Object);

var data = service.GetData();

Assert.Equal("expected data", data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...