如何在一个方法中两次调用Moq中的设置?

时间:2011-07-12 14:20:53

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

我有一个单元测试方法需要在我正在测试的类中模拟(存根?)两个存储库方法调用。我到目前为止所做的每个例子都显示了Mock的一种设置方法,但现在我需要两个。

示例:

_employeeRepositoryMock.Setup(e => e.GetEmployees())
            .Returns(new Employee[]
                     {
                        new Employee
                        {
                            Name = "John Doe"
                        }
                     });
_employeeRepositoryMock.Setup(e => e.UpdateEmployee(1)).Returns(true);

Assert.IsTrue(_employeeService.UpdateEmployeeRecords() > 0);
_employeeRepositoryMock.Verify(gr => gr.UpdateEmployee(1), Times.Exactly(1));

在这个例子中,我需要模拟两个在“UpdateEmployeeRecords()”中调用的存储库方法,但我不确定如何。

更新

抓住这整个问题 - 我忽略了一些简单的事情。我传递了UpdateEmployee的错误数值,导致Assert失败。我将模拟中的参数更改为It.IsAny而不是让它通过。

2 个答案:

答案 0 :(得分:0)

您可以通过创建方法应返回的数据类型(在我的情况下为List<int>List<string>)并使用.Returns返回来执行此操作。现在,只要调用DoSomething()方法,它就会在调用DoSomethingElseThatIsReallyCool()方法时将intResult List作为模拟数据和stringResult List返回:

//Test method
{
  List<int> intResult = new List<int>();
  intResult.Add(0);

  List<string> stringResult = new List<string>();
  stringResult.Add("test");

  _reposMock.Setup(r=>r.DoSomething()).Returns(intResult);
  _reposMock.Setup(r=>r.DoSomethingElseThatIsReallyCool()).Returns(stringResult);

  Assert.IsTrue(_reposMock.SomeMethod() > 0);
}

答案 1 :(得分:0)

您的设置方法似乎没问题。由于某些其他原因,您的断言必定是失败的。一些想法:

  1. 您是否尝试过调试测试以查看正在进行的测试?
  2. 在UpdateEmployee方法中,1是正确的值吗?
  3. (请原谅我,如果这是光顾,但我之前已经这样做了)你是否通过_employeeRepositoryMock.Object将你的模拟传递给你的服务?