如何指定该参数.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);
}
}
我想进行单元测试并检查是否使用正确的参数调用了类 Foo
的DoSomething
。我为此使用了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 来解决(当然单元测试除外 ;-((。
仅通过更改测试代码无法解决问题。被测代码是以非测试友好的方式编写的。
原因是 Rhino Mock 需要模拟/存根方法才能被覆盖。 即 DoSomething()
应该是接口方法(如您所描述的(或虚拟方法。
如果它是可重写的,那么真正的方法DoSomething()
根本不会在Expect()
调用中触发。
这两个选项都可以工作,但都需要更改测试中的代码。
如果这可以修改正在测试的代码,那么在我看来,像IFoo
这样的使用接口而不是抽象类Foo
是可取的方式。因为这是应该正确实现依赖注入的方式。