我需要spyOn另一个方法内部动态创建的对象的方法
因此请考虑以下事项:
public doStuff = () => {
const myThing = new MyThing();
myThing.doSomethingElse().then((data) => {
//do more stuff here...
})
}
因此,我想侦听MyThing实例和对doSomethingElse()
的调用。
我确实遇到了一个解决方案here,该解决方案利用了对象的prototype
,我曾这样尝试过
spyOn(MyThing.prototype, 'doSomethingElse').and.returnValue(Promise.resolve({foo: 'bar'}));
但是当我在测试中调用doStuff()
后,此操作不起作用,我得到了一个错误:
错误:: doSomethingElse()方法不存在
但是我知道这种方法很好,因为它可以在本地按预期运行。
我不确定该如何进行,有人可以协助吗? 谢谢
答案 0 :(得分:0)
您的考试中可能遗漏了一些东西。这是一个简单的测试,您可以看到它按预期运行
require("jasmine");
class MyThing {
async doSomethingElse() {
return { bar: "foo" };
}
}
class Stuff {
doStuff() {
const myThing = new MyThing();
myThing.doSomethingElse().then(data => {
console.log(data);
});
}
}
describe("doSomethingElse", () => {
it("toHaveBeenCalled", () => {
spyOn(MyThing.prototype, "doSomethingElse").and.returnValue(
Promise.resolve({ foo: "bar123" })
);
const stuff = new Stuff();
stuff.doStuff();
expect(MyThing.prototype.doSomethingElse).toHaveBeenCalled();
});
});
关键是在实例化包含spyOn
函数的类之前使用doStuff
。如果将const stuff = new Stuff();
移到spyOn
上方,则会失败。
希望有帮助
答案 1 :(得分:0)
您可以通过传入一个对象(其中属性名称表示方法返回的数据)来使用模拟方法创建间谍对象。
describe('test', () => {
let mock;
beforeEach(() => {
mock = jasmine.createSpyObj('mock', {
doSomethingElse: Promise.resolve({foo: 'bar'})
});
});
it('call mock', async () => {
const result = await mock.doSomethingElse();
expect(result.foo).toEqual('bar');
});
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/3.4.0/jasmine.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/3.4.0/jasmine.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/3.4.0/jasmine-html.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/3.4.0/boot.js"></script>