如何指定该参数.Matches() 不应该返回 default(T)

本文关键字:不应该 default 返回 Matches 何指定 参数 | 更新日期: 2023-09-27 18:34:32

我对犀牛模拟有一点问题。

我有一个抽象类,其中包含一个需要对象的方法(在字符串下方的示例中(。该方法检查参数是否为 null。

public abstract class Foo
{
    public void DoSomething(string bar)
    {
        if (bar == null)
        {
            throw new ArgumentNullException("bar");
        }
    }
}

我还有另一个类,它使用Foo

public class Baz
{
    private readonly Foo foo;
    public Baz(Foo foo)
    {
        this.foo = foo;
    }
    public void DoWork(string s)
    {
        s = "xxx" + s;
        this.foo.DoSomething(s);
    }
}

我想进行单元测试并检查是否使用正确的参数调用了类 FooDoSomething。我为此使用了Arg<T>.Matches()

    [Test]
    public void TestMethod()
    {
        var fooMock = MockRepository.GenerateMock<Foo>();
        var objectUnderTest = new Baz(fooMock);
        fooMock.Expect(x => x.DoSomething(Arg<string>.Matches(Text.StartsWith("xxx"))))
            .Repeat.Once();
        objectUnderTest.DoWork("hello");
        fooMock.VerifyAllExpectations();
    }

现在,当我尝试运行此测试时,Expect(...)提出了一个ArgumentNullException。我查看了 Rhino Mocks 的代码,发现 Match() -Method 总是返回 default(T) ,这对于字符串(以及所有其他类(null。所以签到DoSomething()引发了ArgumentNullException

我知道,我可以提取一个Foo接口并创建该接口的模拟,因此没有空检查。但是我想知道这个问题是否可以通过保持代码原样来解决 Rhino Mocks 来解决(当然单元测试除外 ;-((。

如何指定该参数<T>.Matches() 不应该返回 default(T)

仅通过更改测试代码无法解决问题。被测代码是以非测试友好的方式编写的。

原因是 Rhino Mock 需要模拟/存根方法才能被覆盖。 即 DoSomething()应该是接口方法(如您所描述的(或虚拟方法
如果它是可重写的,那么真正的方法DoSomething()根本不会在Expect()调用中触发。

这两个选项都可以工作,但都需要更改测试中的代码。

如果这可以修改正在测试的代码,那么在我看来,像IFoo这样的使用接口而不是抽象类Foo是可取的方式。因为这是应该正确实现依赖注入的方式。