我是 TDD 的新手,我正在尝试编写使用第三方库(跨平台移动开发)的可测试代码。我想进行测试以仅检查我们的业务逻辑。不用担心它们的实现。
此外,他们的库仅在 native 包装器中公开。由于使用 js 作为开发语言,我想使用 jasmine 进行测试并运行测试以仅在浏览器中检查我的业务逻辑。
以下是我想在测试时忽略/模拟的方法模式。
com.companyname.net.checkInternetAvailable(url)
com.companyname.store.getValue(key)
com.companyname.someother.name(whateverObj, callback) etc.,
此刻,我创建了一个新的 mocks.js
文件,我只是在其中写了
var com = {
"net":{},
"store":{},
"someother":{}
}
com.net.checkInternetAvailable = function(url){
//TODO: fix this!
return true;
}
我对代码中的所有方法都执行相同的操作。我尝试使用 Jasmine SpyOn(com.net, "checkInternetAvailable").and.returnValue(true)
而不是定义所有方法。这种方法的问题是我必须定义所有使用 SpyOn
的方法。
有没有更简单的方法来做到这一点?推荐的方法是什么?
最佳答案
您可以采用的一种方法是使用 Sinon javascript 测试库 stub 第三方库方法。然后可以设置这些 stub 方法来模拟使用实际第三方库难以重现的结果。然后,您的被测系统 (SUT) 可以在 Jasmine 中使用这些 stub 方法。测试。
我在这里写了一个人为的例子:
https://jsfiddle.net/Fresh/uf8owzdb/
代码如下:
// A module which has methods you want to stub
Net = (function() {
// Constructor
function Net() {
}
Net.prototype.checkInternetAvailable = function(url) {
return true;
};
return Net;
})();
// A method which is dependent on the Net module
var methodWhichUsesNet = function(net) {
return net.checkInternetAvailable();
};
// Stub the method behaviour using Sinon javascript framework.
// For the test, get it to return false instead of true.
var net = new Net();
var expectedResult = false;
sinon.stub(net, "checkInternetAvailable").returns(expectedResult);
// Assert method behaviour using a Jasmine test
describe("Net test suite", function() {
it("methodWhichUsesNet should return expected result", function() {
expect(methodWhichUsesNet(net)).toBe(expectedResult);
});
});
请注意,建议使用 stub第三方方法,因为你想准确控制它们应该返回什么,因为你知道你的代码正在使用哪些方法。或者你可以 mock如果您还想验证这些方法是否由使用它们的方法调用,请使用这些第三方方法。您可以 stub 整个第三方对象方法,例如:
var stub = sinon.stub(obj);
但是我建议不要这样做,因为这意味着测试不会那么明确,即您不确定 stub 方法的行为方式,而显式 stub 意味着您可以完全控制它们的行为。
关于javascript - 如何使用嵌套函数(javascript、jasmine)为第 3 方库编写 mock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35926113/