如何在 Angular 单元测试中 mock/spy 导入函数
How to mock/spy an imported function in Angular unit testing
假设我有一个 angular 6 组件,其方法 test
其中 returns 一些值:
import { doSomething } from './helper';
@Component({
...
})
export class AppComponent {
test() {
const data = doSomething(1);
return data.something ? 1: 2;
}
}
doSomething
只是一个简单的辅助函数:
export function doSomething() {
return { something: 1 };
}
是否可以在单元测试中模拟或监视这个函数(这样我就可以控制它的返回值)?或者我必须改变我在组件中的方法吗?
请注意:doSomething()
可以是一个 lodash 函数、一个 const、一个 class 等。我只是尽量让示例保持简单。
我尝试过的事情:
SpyOn
不起作用,因为函数没有附加到任何东西上
将模拟函数导入到 TestBed.configureTestingModule
的 imports
数组中得到 Unexpected value 'doSomething' imported by the module 'DynamicTestModule'. Please add a @NgModule annotation.
为它创建一个服务是可行的,但是必须为每个导入的函数创建服务感觉很傻
在您的规范文件中,以这种方式导入助手:
import * as helper from './helper';
并且在您的 it() 中,您可以监视辅助对象和 return 请求的值:
spyOn(helper, 'doSomething').and.returnValue({});
无法模拟外部函数,但您可以执行以下操作,效果很好。
import { doSomething } from './helper';
@Component({
...
})
export class AppComponent {
const doSomethingRef = doSomething;
test() {
const data = this.doSomethingRef(1);
return data.something ? 1: 2;
}
}
现在,既然我们可以模拟 doSomethingRef
describe('AppComponent ', () => {
let appComponent: AppComponent ;
beforeEach(() => {
TestBed.configureTestingModule({});
appComponent= TestBed.inject(AppComponent);
});
it('should allow mocking', () => {
(appComponent as AppComponent).doSomethingRef = jasmine.createSpy('doSomethingRef ').and.returnValue(1);
expect(guard.test()).toEqual(1);
});
}
假设我有一个 angular 6 组件,其方法 test
其中 returns 一些值:
import { doSomething } from './helper';
@Component({
...
})
export class AppComponent {
test() {
const data = doSomething(1);
return data.something ? 1: 2;
}
}
doSomething
只是一个简单的辅助函数:
export function doSomething() {
return { something: 1 };
}
是否可以在单元测试中模拟或监视这个函数(这样我就可以控制它的返回值)?或者我必须改变我在组件中的方法吗?
请注意:doSomething()
可以是一个 lodash 函数、一个 const、一个 class 等。我只是尽量让示例保持简单。
我尝试过的事情:
SpyOn
不起作用,因为函数没有附加到任何东西上将模拟函数导入到
TestBed.configureTestingModule
的imports
数组中得到Unexpected value 'doSomething' imported by the module 'DynamicTestModule'. Please add a @NgModule annotation.
为它创建一个服务是可行的,但是必须为每个导入的函数创建服务感觉很傻
在您的规范文件中,以这种方式导入助手:
import * as helper from './helper';
并且在您的 it() 中,您可以监视辅助对象和 return 请求的值:
spyOn(helper, 'doSomething').and.returnValue({});
无法模拟外部函数,但您可以执行以下操作,效果很好。
import { doSomething } from './helper';
@Component({
...
})
export class AppComponent {
const doSomethingRef = doSomething;
test() {
const data = this.doSomethingRef(1);
return data.something ? 1: 2;
}
}
现在,既然我们可以模拟 doSomethingRef
describe('AppComponent ', () => {
let appComponent: AppComponent ;
beforeEach(() => {
TestBed.configureTestingModule({});
appComponent= TestBed.inject(AppComponent);
});
it('should allow mocking', () => {
(appComponent as AppComponent).doSomethingRef = jasmine.createSpy('doSomethingRef ').and.returnValue(1);
expect(guard.test()).toEqual(1);
});
}