如何断言命令不重要的IEnumerable参数?

时间:2014-02-03 11:44:13

标签: c# unit-testing rhino-mocks

我正在编写单元测试,我想确保使用一些参数调用特定方法:

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)。

如何断言此方法调用?

2 个答案:

答案 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将生成的描述更具描述性。