了解Moq的Setup()函数

时间:2015-08-21 15:49:25

标签: c# asp.net-mvc unit-testing moq

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

2 个答案:

答案 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); 

你准备做什么?