Rhino Mocks:如何在期望中匹配数组参数?

时间:2009-09-15 17:41:45

标签: c# rhino-mocks

再次出现在Rhino Mocks Noob Wall

mockUI.Expect( x => x.Update( new Frame[] {Frame.MakeIncompleteFrame(1, 5)} ) );

这是我需要匹配的确切参数。通过跟踪语句,我已经验证了这也是实际输出,即代码表现如预期,但测试不同意。 RhinoMocks用

回应
TestBowlingScorer.TestGamePresenter.TestStart:
Rhino.Mocks.Exceptions.ExpectationViolationException : IScoreObserver.Update([Frame# 1, Score =  0 Rolls [  5,  PENDING,  ]]); Expected #1, Actual #0.

一个Frame对象包含很少的属性但是不会覆盖Equals()(覆盖上面看到的ToString())。 Update接收一个Frame数组; 我该如何设定这个期望?我看到一个Is.Matching约束..不确定如何使用它,或者更关心它的冗长性质。

我有一个帮助NUnit样式自定义Assert

public static void AssertFramesAreEqual(Frame[] expectedFrames, Frame[] actualFrames)
{
  // loop over both collections
     // compare attributes
}

2 个答案:

答案 0 :(得分:3)

@Gishu, 是的,就是这样。我刚刚也了解了Arg<>静态类,它应该允许你做这样的事情:

mockUI.Expect( x => x.Update(Arg<Frame[]>
           .Matches(fs=>HelperPredicates.CheckFrames ( expected, fs)) ));

还有Arg&lt;&gt; .List配置的起点,我还没有探索过,但可能更适合你想要的东西

答案 1 :(得分:2)

已验证的作品..不知道这是否是RhinoMocks方式

var expectedFrames = new Frame[] { Frame.MakeIncompleteFrame(1, 5) };
mockUI.Expect( x => x.Update(null) )
            .IgnoreArguments()
            .Constraints( Is.Matching<Frame[]>( frames => HelperPredicates.CheckFramesMatch(expectedFrames, frames) ) );

辅助谓词只是一个返回布尔值的函数 - 精确匹配时为True,否则为false。

 public static bool CheckFramesMatch(Frame[] expectedFrames, Frame[] actualFrames)
  {
     // return false if array lengths differ
     // loop over corresponding elements
          // return false if any attribute differs
     // return true
  }