gpt4 book ai didi

javascript - 如何使用嵌套函数(javascript、jasmine)为第 3 方库编写 mock

转载 作者:数据小太阳 更新时间:2023-10-29 06:15:29 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com