gpt4 book ai didi

javascript - 使用 Jasmine 模拟多个方法调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:26:11 25 4
gpt4 key购买 nike

我正在尝试用 JavaScript 编写测试,我正在测试的方法进行了 2 次方法调用(model.expandChildren() 和 view.update();)

// inside 'app' / 'RV.graph'
var expandChildren = function(){
return model.expandChildren().then(function(r) {
view.update(r);
});
};

我曾尝试使用 Jasmine 规范编写对 View 和模型函数的 spyOn 测试,但在给定测试中似乎只能有 1 个 spy 。看来我在这里遗漏了一些重要的东西,应该有一种方法可以使用 spy 模拟多个方法调用,因为我的函数需要进行这两个调用。

我希望我的规范能够按照下面的方式运行,但它目前只通过了第一个测试(第一个 spy 按预期运行),第二个测试失败,因为 Jasmine 正在尝试运行实际功能,而不是 spy 功能:

var model = GRAPH.model;
var view = GRAPH.view;
var app = RV.graph;

describe('#expandChildren', function() {

beforeEach(function() {
// first spy, all good
spyOn(model, 'expandChildren').and.callFake(function() {
return new Promise(function(resolve) {
resolve(testResponse);
});
});
// second spy doesn't work because Jasmine only allows 1
spyOn(view, 'update');
app.expandChildren();
});

// passing test
it('calls model.expandChildren', function() {
expect(model.expandChildren).toHaveBeenCalled();
});

// failing test that runs the REAL view.update method
it('calls view.update', function() {
expect(view.update).toHaveBeenCalled();
});
});

有没有办法用 Jasmine 做到这一点?

最佳答案

请记住,您正在使用异步调用。第一次调用是同步的,所以会被记录下来,但第二次调用只会在稍后发生。在事情发生的时候给自己一些控制权。我通常使用这样的模式:

describe('#expandChildren', function() {
var resolver;

it('calls model.expandChildren', function(done) {
spyOn(model, 'expandChildren').and.callFake(function() {
return new Promise(function(resolve) {
resolver = resolve;
});
});
spyOn(view, 'update');

app.expandChildren();

expect(model.expandChildren).toHaveBeenCalled();
expect(view.update).not.toHaveBeenCalled();

resolver();
done();

expect(view.update).toHaveBeenCalled();
});
});

这样,规范只会在 promise 已解决且 done() 已被调用后运行。

关于javascript - 使用 Jasmine 模拟多个方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42380321/

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