我对Setup()感到困惑。

根据我的理解,当我们声明:

Mock<IUnitOfWork> uwork = new Mock<IUnitOfWork>();


我们正在创建一个模拟存储库,它将永远不会真正接触到数据库。由于它永远不会触及数据库,因此我们必须为其提供一些模拟数据。

例如:

Question question = new Question {
    Title = "General question",
    Message = "Message body text..."
}


这是我有点困惑的地方。根据我的理解,我们正在告诉我们的Mocked存储库要返回什么数据以及在什么情况下返回它。

                   // in this circumstance         // return this
uwork.Setup(i =. i.QuestionsRepository.GetById(1)).Returns(question)


至此,我们创建了控制器的实例,并将uwork.object传递给控制器​​实例。当控制器调用(情况)方法时,我们的Mock存储库将生成我们指定的返回值。



它是否正确?如果没有阻止我,请纠正我。如果是这样,那么为什么这样的事情不起作用,我该如何解决呢?

控制器:

uwork.QuestionRepository.GetAll().Where(l => l.Message_Id == id).ToList();


TestController:

uwork.Setup(i => i.QuestionsRepository
        .GetAll().Where(l => l.Message_Id == 1).ToList())
        .Returns(questions);
        // questions is a List<Question>


我有一个例外:


  类型“ System.NotSupportedException”的异常发生在
  Moq.dll,但未在用户代码中处理
  
  附加信息:表达式引用的方法不
  属于模拟对象:i =>
  i.LegalInquiryRepository.GetAll()。其中​​(l =>
  l.legalCommunication_Id ==

最佳答案

之所以遇到该异常,是因为您试图建立一个不属于模拟(Where)的方法(uwork)。

您需要先设置i.QuestionRepository属性,然后设置GetAll方法。

无法模拟Where方法(假设它是为IQueryable定义的方法),因为它是静态的-没关系。只需确保源集合具有正确的元素,然后Where将选择它们。

var questionsRepoMock = //...

uwork.SetupGet(i => i.QuestionsRepository).Returns(questionsRepoMock.Object);


questionsRepoMock.Setup(r => r.GetAll())
                 .Returns(questions);

关于c# - 了解Moq的Setup()函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32144504/

10-12 22:34