用 Dart 模拟 - 如何测试作为参数传递的函数是否被调用?

mra*_*d01 1 dart

诚然,这是一个有点奇怪的测试用例,但这是我遇到的一个问题。我有一个类,它在其构造函数中将函数作为参数。我想知道是否调用了传递的函数。下面是一个例子:

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,这似乎会失败。我没有看到任何明确的方法来让它发挥作用,但我认为这是可能的。

有任何想法吗?

Vid*_*dya 5

在 Dart 中,所有函数都是类Function的实例,因为您将 的实例传递FunctionClassThatCallsRealClass构造函数。的实例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