Rhino Mocks中不区分大小写的期望

时间:2010-04-11 11:58:43

标签: c# unit-testing case rhino-mocks

我正在使用Rhino Mocks期待一个电话。有一个参数是一个字符串。但我并不担心字符串的情况。即使案例错误,我也希望测试通过。所以我正在做以下事情:

//expect log message to be called with a string parameter.  
//We want to ignore case when verifying so we use a constraint 
//instead of a direct parameter

Expect.Call(delegate { logger.LogMessage(null); })
      .Constraints(Is.Matching<string>(x => x.ToLower()=="f2"));

看起来有点啰嗦。有没有更合理的方法呢?

2 个答案:

答案 0 :(得分:2)

// arrange
var loggerStub = MockRepository.GenerateStub<ILogger>();

// act
loggerStub.LogMessage("f2");

// assert
loggerStub.AssertWasCalled(
    x => x.LogMessage(Arg<string>.Matches(
        s => string.Equals(s, "f2", StringComparison.OrdinalIgnoreCase)
    ))
);

如果你不关心参数而只关心方法调用:

loggerStub.AssertWasCalled(
    x => x.LogMessage(null),
    x => x.IgnoreArguments()
);

答案 1 :(得分:1)

我会使用@Darin建议的(或类似的)AAA格式。我认为它更简洁,但我认为你仍然必须使用相同的基本约束进行不区分大小写的匹配。辅助方法可以使其更具可读性。

 private bool CaseInsensitive( string s, string t )
 {
      return string.Equals( s, t, StringComparison.OrdinalIgnoreCase );
 }

 var loggerMock = MockRepository.GenerateMock<Logger>();

 loggerMock.Expect( l => l.LogMessage( Arg<string>.Matches( s => CaseInsensitive( s, "f2" ))));

 classUnderTest.MethodUnderTest();

 loggerMock.VerifyAllExpectations();