我对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/