Rhino模拟AssertWasCalled不起作用

问题描述 投票:0回答:1

我编写了以下测试用例来说明使用Rhino Mocks的问题:

[TestClass]
public class Tester
{
    public class TestList<T> : List<T>
    {
        public override bool Equals(object obj)
        {
            // obj is an empty list here??
            return base.Equals(obj);
        }
    }

    public interface IStubbedInterface
    {
        void DoSomethingWithList(TestList<int> list);
    }

    public class ClassToTest
    {
        public IStubbedInterface TheStub { get; set; }

        public void Run()
        {
            var list = new TestList<int> { 1, 2 };
            TheStub.DoSomethingWithList(list);
            list.Clear();
        }
    }

    public bool Match(TestList<int> arg)
    {
        // Here arg is an empty list??
        return arg == new TestList<int> { 1, 2 };
    }

    [TestMethod]
    public void Test()
    {
        var classToTest = new ClassToTest();
        classToTest.TheStub = MockRepository.GenerateMock<IStubbedInterface>();
        classToTest.Run();
        classToTest.TheStub.AssertWasCalled(
            x => x.DoSomethingWithList(new TestList<int>() { 1, 2 }));
            //x => x.DoSomethingWithList(Arg<TestList<int>>.Matches(arg => Match(arg))));
    }
}

无论我直接比较列表还是使用Arg <>。Matches(..)语法,该测试用例都不会在AssertWasCalled()行上失败。我还尝试了MockRepository.GenerateStub <>(..)而不是GenerateMock <>(..),这也失败了。由于list.Clear();失败。调用DoSomethingWithList()之后的第二行,这导致列表在AssertWasCalled()时也为空。这是RhinoMocks的错误吗?我本以为RhinoMocks会在调用断言函数时以某种方式记录该参数的快照,但看来RhinoMocks一直在使用同一对象?

在遇到此问题的真实情况下,我正在测试的函数的参数包装在using()语句中,这导致AssertWasCalled无法测试传递的参数的效果相同。

c# unit-testing rhino-mocks stub rhino-mocks-3.5
1个回答
0
投票
看起来像使用Expect()/ VerifyAllExpectations()模式在此测试方案中效果更好。将测试用例更改为以下代码将通过。

这很不幸,因为我更喜欢使用AssertWasCalled(),但是就目前的情况来看,这是非常不可靠的。

[TestMethod] public void Test() { var classToTest = new ClassToTest(); classToTest.TheStub = MockRepository.GenerateMock<IStubbedInterface>(); classToTest.TheStub.Expect( x => x.DoSomethingWithList(new TestList<int>() { 1, 2 })); classToTest.Run(); classToTest.TheStub.VerifyAllExpectations(); }

© www.soinside.com 2019 - 2024. All rights reserved.