我正在编写单元测试,我想确保使用一些参数调用特定方法:
var myMock = MockRepository.GenerateMock<IMyService>();
IMyService上有一个方法,带有签名
public bool SomeMethod(IEnumerable<string> values)
我有一个消耗我的模拟
的业务逻辑层public class BusinessLogic
{
protected MyMock MyMock{get;set;}
public BusinessLogic (myMock)
{
this.MyMock = myMock;
}
public bool DoLogic()
{
var myCollection = // loaded from somewhere
return this.MyMock(myCollection);
}
}
我想通过确保它正确调用SomeMethod来测试DoLogic方法。但是我没有控制权(并且真的不希望它超过集合的顺序)。
我想声明使用IEnumerable SomeMethod
调用方法{"a", "b", "c"}
,但我不关心顺序。
到目前为止我已经
了myMock.Expect(x => x.MyMethod(new string[]{"a", "b", "c"});
和
myMock.AssertWasCalled(x => x.MyMethod(new string[]{"a", "b", "c"});
但是如果用{"b", "a", "c"}
调用它会失败。我不想改变我的业务逻辑以确保参数的排序(因为这会在测试周围设计BLL)。
如何断言此方法调用?
答案 0 :(得分:6)
您可以使用Arg<T>.Matches
:
myMock.Expect(x => x.MyMethod(Arg<IEnumerable<string>>.Matches(s => !s.Except(expected).Any() && !expected.Except(s).Any()));
答案 1 :(得分:-1)
测试框架通常有这种匹配的断言,你可以把它们混合起来。 NUnit的EquivalentTo
:
myMock.Expect(x => x.MyMethod(Arg<IEnumerable<string>>.Matches(value =>
{
Assert.That(value, Is.EquivalentTo(new[] { "c", "b", "a" }));
return true;
}));
这样,生成的错误消息应该比Rhino将生成的描述更具描述性。