如何存根函数并为Reference Type参数定义相等比较器

时间:2013-04-12 21:33:44

标签: c# unit-testing mocking rhino-mocks rhino

我基本上想要存根函数,但是为参考类型参数定义我自己的相等比较器。

我想存根函数来返回数据。我希望方法的参数可以通过特定值而不是ReferenceEquals进行比较。我也不想为我的参数引用类型创建一个equals覆盖。我认为以下是实现这一目标的方法,但我收到了一个例外。还有另一种方法可以做到这一点和/或我在这里做错了吗?

异常消息: System.Reflection.AmbiguousMatchException:找到了模糊匹配。

    public class Parameter
    {
        public string Property1 { get; set; }
    }

    public interface IStubbable
    {
         string DoStuff(Parameter param);
    }

    public class ThisService
    {
        private IStubbable _stubbable;
        public ThisService(IStubbable stubbable)
        {
            _stubbable = stubbable;
        }

        public string DoTheStuff(Parameter param)
        {
            return _stubbable.DoStuff(param);
        }
    }

    [Test]
    public void TestStubbing()
    {
        const string expectedResult = "Totes";

        var iStub = MockRepository.GenerateStub<IStubbable>();

        const string prop1 = "cool stub bro";
        iStub
            .Stub(x => x.DoStuff(Arg<Parameter>.Matches(y => y.Property1 == prop1)))
            .Return(expectedResult);


        var service = new ThisService(iStub);

        var result = service.DoTheStuff(new Parameter() {Property1 = prop1});

        Assert.AreEqual(expectedResult, result);
    }

1 个答案:

答案 0 :(得分:0)

这篇文章提供了实现这一目标的另一种方式。 Rhino Mocks - Using Arg.Matches

将存根更改为:

        iStub.Stub(x => x.DoStuff(new Parameter()))
            .Constraints(new PredicateConstraint<Parameter>(y => y.Property1 == prop1 ))
            .Return(expectedResult);