诚然,这是一个有点奇怪的测试用例,但这是我遇到的一个问题。我有一个类,它在其构造函数中将函数作为参数。我想知道是否调用了传递的函数。下面是一个例子:
class TestClassMock extends Mock implements RealClass {
RealClass _real;
TestClassMock() {
_real = new RealClass();
when(callsTo("myNamedFunction")).alwaysCall(_real.myNamedFunction);
}
}
class RealClass {
String _name = "RealClass";
Function myNamedFunction;
RealClass() {
myNamedFunction = _theNamedFunction;
}
String _theNamedFunction() {
return _name;
}
}
class ClassThatCallsRealClass {
ClassThatCallsRealClass(Function func) {
func();
}
}
//The test
TestClassMock testClassMock = new TestClassMock();
ClassThatCallsRealClass caller = new ClassThatCallsRealClass(testClassMock.myNamedFunction);
testClassMock.getLogs(callsTo("myNamedFunction")).verify(happenedOnce);
Run Code Online (Sandbox Code Playgroud)
所以稍微解释一下,ClassThatCallsRealClass 将一个函数作为参数并调用它。如果您要传入 (Instance Of RealClass).myNamedFunction,这将依次调用 RealClass 上的私有函数 _theNamedFunction。但是,如果您尝试模拟 RealClass 并将所有调用从 myNamedFunction 重定向到 RealClass myNamedFunction,这似乎会失败。我没有看到任何明确的方法来让它发挥作用,但我认为这是可能的。
有任何想法吗?
在 Dart 中,所有函数都是类Function的实例,因为您将 的实例传递Function给ClassThatCallsRealClass构造函数。的实例Function有一种方法call()如图这里。
同时,Dart 有一个非常好的模拟能力在这里描述(感谢@KWalrath 的更新)。
所以你需要做的就是像测试任何其他对象一样使用模拟进行测试。正如参考资料中所述,ClassThatCallsRealClass为您的Function实例创建一个间谍和一个模拟。然后verify(happenedOnce)在call()在函数方法。
要模拟您的功能,请执行以下操作:
class MockFunction extends Mock {
call(int a, int b) => a + b;
}
var mock = new MockFunction();
mock(1,2); //returns 3
Run Code Online (Sandbox Code Playgroud)
当然,参数列表 tocall将匹配实际函数的参数列表。传递mock给你的间谍ClassThatCallsRealClass。
| 归档时间: |
|
| 查看次数: |
3616 次 |
| 最近记录: |