我对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>
我得到例外:
类型&#39; System.NotSupportedException&#39;的例外情况发生在 Moq.dll但未在用户代码中处理
附加信息:表达式引用的方法没有 属于模拟对象:i =&gt; i.LegalInquiryRepository.GetAll()。其中(l =&gt; l.legalCommunication_Id ==
答案 0 :(得分:3)
您正在获取该异常,因为您正在尝试设置不属于模拟(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);
答案 1 :(得分:1)
设置中包含的Where()和ToList()导致错误。没有它你试过吗?
uwork.Setup(i => i.QuestionsRepository.GetAll()).Returns(questions);
你准备做什么?