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

标签 javascript unit-testing mocking jasmine tdd

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

相关文章:

unit-testing - 在 Jenkins 中运行多个单元测试项目只记录第二组结果

PhpStorm Laravel 4.2 fatal error : Class 'TestCase' not found in

c++ - 如何在 C++ 中使用 gtest/gmock 为调用另一个全局函数的全局函数编写单元测试?

.net - 为 .Net 选择模拟框架时应该考虑什么

python - 在 Python 中,是否有模拟 httplib 响应的库?

javascript - 在 jQuery 中的 IE8 上意外调用方法或属性访问

javascript - 根据 JavaScript/JSON/Ajax 从 Go-Variable 中获取 Struct/Variables

javascript - 单击 javascript 时颜色不会正确更改

javascript - HTML5 Canvas - 如何在图像背景上画一条线?

Angular 2 - MockBackend - Passtrough 等效吗?