gpt4 book ai didi

angular - 我如何从 RXJS 5.5.6 模拟 fromEvent 函数?

转载 作者:太空狗 更新时间:2023-10-29 17:15:45 25 4
gpt4 key购买 nike

我必须测试一个使用 fromEvent 可观察函数的函数。在升级到“可出租”运营商之前,我只是这样做:

spyOn(Observable, 'fromEvent').and.callFake(mockFromEventFunction)

但是现在,Rxjs 发生了变化,Observable.fromEvent 只是一个名为fromEvent 的函数,它是这样导入的:(并以相同的方式使用)

import { fromEvent } from 'rxjs/observable/fromEvent';

我的问题是,如何在不知道其父上下文的情况下使用 Jasmine spy 实用程序模拟该函数?

我建议这行不通:

import * as FromEventContext from 'rxjs/observable/fromEvent';
...
spyOn(FromEventContext , 'fromEvent').and.callFake(mockFromEventFunction)

现在我有了一个解决方法,将 fromEvent 包装在一个我知道上下文的对象中。但我想知道如何彻底解决这个问题。

提前致谢。

最佳答案

经过一番调查后,我发现我们能否模拟这个单个导出函数的事实直接取决于我们的 bundler 在测试时如何解析模块。

例如,您可能会遇到此错误或类似错误:

Error: : myFunctionName is not declared writable or has no setter

因为 bundler 只是将那些单独的导出函数包装到一个 getter 属性中,使它们无法模拟。

我最终使用的解决方案是在测试时'commonjs'中编译模块。

例如,如果您使用的是 typescript,则需要更改 tsconfig.spec.ts 以使用 commonjs 模块:

"compilerOptions": {
....
// force commonjs module output, since it let mock exported members on modules to anywhere in the application (even in the same file)
"module": "commonjs",
},

commonjs 中模块的任何导出成员的结果输出如下:exports.myFunc = function() {}。这导致不用担心使用 spyOn,因为它被包裹在“exports”对象上。一个很好的用例是它可以在任何地方被模拟,包括在它自己的文件中的用法!

例子:

// some-module.js
export function functionToMock() {
return 'myFuncToMock';
}
export function functionToTest() {
return functionToMock();
}

// testing-module.spec.js
import * as SomeModule from ./some-module
spyOn(SomeModule, 'functionToMock').and.returnValue('mockedCorrectly');
SomeModule.functionToTest().toBe('mockedCorrectly')

关于angular - 我如何从 RXJS 5.5.6 模拟 fromEvent 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48420900/

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