JustLock-检查传递的方法参数的值
本文关键字:方法 参数 检查 JustLock- | 更新日期: 2023-09-27 18:25:28
我使用JustLock框架,并有以下断言:
Mock.Assert(() => activityListenerMock.PeriodPassed(
Arg.Matches<Period>(e => e.Length == expectedLength)));
它以神秘的消息失败:
Occurrence expectation failed. Expected at least 1 call. Calls so far: 0
我怎样才能得到更好的信息。我想知道它被称为什么价值。
方法实际上被调用了,但使用了错误的参数,因为当我将断言更改为以下时,它会通过:
Mock.Assert(() => activityListenerMock.PeriodPassed(
Arg.IsAny<Period>()));
PeriodPassed
的参数的一种方法是使用JustLock的DebugView
将DebugView.IsTraceEnabled = true;
放在测试开始处,并将DebugView.CurrentState
添加到手表中。接近尾声时,你会看到这样的曲调:
Invocations:
(ByRef ...).PeriodPassed("period value will go here") called 1 time; (signature: ...)
周期值将显示在Invocations列表中。
另一种方法是将匹配器提取到一个单独的lambda中,并使用断点:
Predicate<Period> matcher = e => e.Length == expectedLength;
Mock.Assert(() => activityListenerMock.PeriodPassed(
Arg.Matches<Period>(e => matcher(e))));
现在,您可以在谓词中放置一个断点,并检查e
参数的值。这是因为现在谓词不是一个表达式,而是一个实际的函数,所以现在可以调试它了
正如Stefan Dragnev所写。我使用了他的想法,然后添加了逻辑来验证输入。如果不是预期的值,则调用Assert.Fail()。不确定是否有更好的方法,但这很有效:
Mock.Arrange(() => _uowMock.Class.Add(
Arg.Matches<ModelClass>(x => (CheckArgs(x, updated)))))
.DoNothing().Occurs(3);
protected static bool CheckArgs(ModelClass x, int y)
{
if (x.val != y)
{
Assert.Fail("Houston we have a problem");
}
return true;
}
之前添加额外的排列也对我有效,但它非常棘手:
Mock.Arrange(() => activityListenerMock.PeriodPassed(Arg.IsAny<Period>())).
DoInstead((Period p) => Console.WriteLine("Actual " + p.Length+" expected "+expectedLength));
今天也陷入了同样的困境,并开始对Krzysztof的想法进行扩展。它很粗糙,但很实用。
public static class JustMockExtensions {
public static FuncExpectation<T> PrintParams<T, T1>(this FuncExpectation<T> mock) {
return mock.DoInstead<T1, T>((arg1, arg2) => {
string message = string.Empty;
message += Process(arg1);
message += Process(arg2);
Console.WriteLine(message);
});
}
private static string Process<T>(T obj) {
if (typeof(T).IsEnum) {
return Enum.GetName(typeof(T), obj);
}
return obj.ToString();
}
}
到目前为止,以这种方式使用它可以使其在正常流量中通过管道输送。
Mock.Arrange(() => foo.bar(Arg.IsAny<Widget>(), Arg.IsAny<WidgetTypeEnum>()))
.PrintParams<Widget, WidgetTypeEnum>()
.MustBeCalled();