我一直在研究新的 API 包装器,并且不想在每次运行单元测试时都调用 API。因此,如此处所述,我在嘲笑它。
我最初认为我嘲笑它的方式有问题,但似乎问题出在其他地方。
我想要完成的事情非常简单。当我的单元测试运行时,我想返回一个值,就好像我已经出去从我正在集成的外部 API 中获取信息一样。
我使用 http.Client 作为可选参数来初始化我的类,因此我可以在单元测试运行时将其传入:
SampleClass(String arg1, String arg2, [http.Client httpClient = null]) {
this._arg1 = arg1;
this._arg2 = arg2;
_httpClient = (httpClient == null) ? http.Request : httpClient;
}
Future apiRequest(String resource, [Map<String, String> body]) {
var url = buildBaseUrl(resource).toString();
var request = new http.Request('POST', Uri.parse(url));
request.bodyFields = body;
return this._httpClient.send(request).then((response) => response.stream.bytesToString().then((value) => value.toString()));
}
在我的单元测试中,我创建了以下模拟类:
class HttpClientMock extends Mock implements http.Client {
noSuchMethod(i) => super.noSuchMethod(i);
}
class HttpResponseMock extends Mock implements http.Response {
noSuchMethod(i) => super.noSuchMethod(i);
}
在我的单元测试中检查响应我正在执行以下操作:
test("Send SMS errors with wrong account", () {
var mockHttpClient = new HttpClientMock()
..when(callsTo('send')).alwaysReturn(message401);
var sample = new SampleClass(_arg1, _arg2, mockHttpClient);
future = sample.apiRequest(...parameters here...).then((value) => value.toString());
expect(future.then((value) => JSON.decode(value)), completion(equals(JSON.decode(message401))));
});
所以,正如你所看到的,我正在努力做到这一点,所以调用 send 返回message401
,这只是一个JSON
字符串。
这没有发生,因为message401
它是一个字符串,并且因为我的代码试图将它用作 Future,所以我总是得到错误:
顶级未捕获错误:类“String”没有实例方法“then”。
我完全理解为什么会出现此错误,但不知道如何解决它。
任何帮助表示赞赏。