作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我必须测试一个使用 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/
我是一名优秀的程序员,十分优秀!