【问题标题】:Ability to pass array to mocked method call能够将数组传递给模拟方法调用
【发布时间】:2011-01-18 06:59:28
【问题描述】:

我有一个我想模拟的方法,它需要一个数组作为参数。在实际调用中,该方法将修改此数组,并且生成的数组将在代码中进一步使用。 我试图做的是将数组传递给模拟方法调用,该方法具有在再次使用数组时有效的值。但是我发现当调用模拟方法时,它不使用我在设置模拟时指定的数组,而是使用原始数组,有没有办法解决这个问题。

例如

public interface ITest
{
    int Do(int[] values);
}

public void MyTest
{
    var testMock = new Mock<ITest>();
    int[] returnArray = new int[] {1,2,3};
    testMock.Setup(x => x.Do(returnArray)).Returns(0);
    MyTestObject obj = new MyTestObject();
    obj.TestFunction(testMock.Object);
}

public class MyTestObject
{
  .....
    public void TestFunction(ITest value)
    {
         int [] array = new int[3];
         value.Do(array);
         if (array[0] == 1) 

这是我的测试失败的地方,因为数组仍然是上面两行声明的空数组,而不是我在模拟方法调用中指定的数组。希望这能解释我正在努力实现的目标,如果是这样的话,无论如何都会这样做。如果可以这样做,也可以使用 RhinoMocks。

提前致谢,

凯夫

【问题讨论】:

    标签: unit-testing mocking rhino-mocks moq


    【解决方案1】:

    您在这里所做的唯一一件事就是设置一个期望,即您的 Do 方法将以 returnArray 作为参数调用,并且它将返回 0 作为结果。你想做的是

    1. 创建严格的模拟以更好地查看正在执行的内容
    2. 设置一个需要初始数组的调用,然后运行委托将值设置为 1、2、3

    使用 Rhino Mock 看起来像这样(使用 moq 将是等效的):

    private delegate int DoDelegate(int[] values);
    
    [Test]
    public void MyTest()
    {
        var testMock = MockRepository.GenerateStrictMock<ITest>();
        testMock.Expect(x => x.Do(null))
            .IgnoreArguments()
            .Do(new DoDelegate(delegate(int[] values)
                                 {
                                     values[0] = 1;
                                     values[1] = 2;
                                     values[2] = 3;
                                     return 0;
                                 }));
    
        //Execution (use your real object here obviously
        int[] array = new int[3];
        testMock.Do(array);
        Assert.AreEqual(1, array[0]);
    }
    

    【讨论】:

    • Cheers Mate 为我完成了这项工作。再次感谢,凯夫
    猜你喜欢
    • 2016-02-15
    • 2012-02-03
    • 2015-05-04
    • 2010-10-23
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多