我创建了一个模拟的界面IManager。它有方法
void LogUserWithParams(string maskValue, E_LOG_LEVEL logLevel,
string formatMsg, ref Array args);
我创建了一个测试来检查是否使用任何参数调用该方法。
Array logParams = Arg<Array>.Ref(Is.Anything(), new object[0]).Dummy;
manager.AssertWasCalled(man => man.LogUserWithParams(
Arg<string>.Is.Anything,
Arg<E_LOG_LEVEL>.Is.Anything,
Arg<string>.Is.Anything,
ref logParams
)
);
它产生了一个非常奇怪的信息: 必须使用以下参数定义参数0:Arg.Is,Arg.Text或Arg.List
如您所见,所有参数都是使用Arg定义的。关于测试有什么问题的任何想法?
答案 0 :(得分:3)
以您的方式(使用预定义变量)调用它会导致抛出异常。这就是诀窍:
manager.AssertWasCalled(man => man.LogUserWithParams(
Arg<string>.Is.Anything,
Arg<E_LOG_LEVEL>.Is.Anything,
Arg<string>.Is.Anything,
ref Arg<Array>.Ref(Is.Anything(), new object[0]).Dummy
));
修改强>
我试验了这个简单的程序,一切似乎按预期工作:
public interface ILogger
{
void LogUserWithParams(string maskValue, ref Array args);
}
class Program
{
static void Main(string[] args)
{
var loggerMock = MockRepository.GenerateMock<ILogger>();
loggerMock.Expect(l => l.LogUserWithParams(
Arg<string>.Is.Anything,
ref Arg<Array>.Ref(Is.Anything(), new object[0]).Dummy
));
Array output = new Array();
loggerMock.LogUserWithParams("[a-z]", ref output);
loggerMock.VerifyAllExpectations();
Console.WriteLine("Done...");
Console.ReadLine();
}
}