Ошибка типа при использовании Moq для имитации зависимости для тестируемого объекта - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть класс проверки, который я пытаюсь проверить FluentQuestionAnswerValidator, но у этого класса есть зависимость IQuestionAnswerRepository, которую необходимо передать через конструктор, чтобы создать экземпляр класса валидатора.

Чтобы попытаться создать экземпляр класса, я использую Moq для макета репозитория, который затем можно передать в валидатор.

Однако я получаю ошибку типа, когда пытаюсь передать проверенный репозиторий в валидатор при его создании:

Error   CS1503  Argument 2: cannot convert from 
'Moq.Mock<IQuestionAnswerRepository>' to 'IQuestionAnswerRepository'    

Как изменить полученный код, чтобы он принимал макетированное хранилище в качестве своей зависимости?

class QuestionAnswerValidationTest
    {
        private QuestionAnswer _qaTest;
        private FluentQuestionAnswerValidator _validator;
        private Mock<IQuestionAnswerRepository> mockRepo;

        [SetUp]
        public void Setup()
        {
            _qaTest = new QuestionAnswer()
            {
                Id = 2,
                Type = "Number",
                Required = true,
                QuestionSection = 1,
            };

            QuestionAnswer qa = new QuestionAnswer()
            {
                Id = 1,
                Type = "String",
                Required = true,
                QuestionSection = 1,
                Answer = "Yes",
                ConditionalQuestionId = null,
                ConditionalQuestionAnswered = null
            };

            Dictionary<int, QuestionAnswer> questionMap = new Dictionary<int, QuestionAnswer>();
            questionMap.Add(qa.Id, qa);

            mockRepo = new Mock<IQuestionAnswerRepository>(MockBehavior.Strict);
            mockRepo.Setup(p => p.QuestionMap).Returns(questionMap);
        }

        [Test]
        public void Validate_AnswerDoesNotMatchQuestionType_ProducesValidationError()
        {
            _qaTest.Answer = "string";

            _validator = new FluentQuestionAnswerValidator(_qaTest, mockRepo);
        }
    }

1 Ответ

0 голосов
/ 06 ноября 2018

Ваш FluentQuestionAnswerValidator, очевидно, ожидает экземпляр IQuestionAnswerRepository, а не Mock<IQuestionAnswerRepository>. Поскольку не существует неявного преобразования между этими двумя, вы получаете ошибку.

На самом деле вы хотите предоставить не сам макет, а экземпляр , создаваемый фреймворком. Так что используйте это вместо:

_validator = new FluentQuestionAnswerValidator(_qaTest, mockRepo.Object);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...