【发布时间】:2019-07-03 12:30:16
【问题描述】:
mockData.js
var userInfo = {
URLs: {
AppURL: "A"
},
EncryptedBPC: "B"
};
karma.config.js
config.set({
basePath: '',
files:['mockData.js' ],
.....
ComponentDetailsComponent:
.....some imports
import { ComponentDetailsService } from '../component-details.service';
declare var userInfo: any;
@Component({
.....more code
rfxFilter() {
return userInfo.URLs.AppURL;
}
}
规格:
describe('ComponentDetailsComponent', () => {
let subject:any;
let fixture: ComponentFixture<ComponentDetailsComponent>;
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [ ComponentDetailsComponent ],
providers: [{ provide: ComponentDetailsService, useClass:
ComponentDetailsServiceStub }],
});
fixture = TestBed.createComponent(ComponentDetailsComponent);
subject = fixture.componentInstance;
});
it('should return X', () => {
subject.userInfo = {
URLs: {
AppURL: "X"
},
EncryptedBPC: "Y"
};
let result = subject.rfxFilter();
expect(result).toBe("X");
});
});
输出:
ReferenceError: userInfo 未定义
我通过在组件内创建一个返回 userInfo 全局变量的方法使其工作。
getuserInfo():any{
return userInfo;
}
并在规范中模拟该方法:
let m = {
URLs: {
AppURL: "mockvalueAppURL",
},
EncryptedBPC: "mockEncryptedBPC",
};
let spy = spyOn(subject, 'getuserInfo').and.returnValue(m);
是否可以模拟这样的全局变量而不必将其封装在方法中,然后模拟方法而不是变量?我希望在由其他人编写时保持应用程序代码不变。
【问题讨论】:
-
您是否尝试过使用 behaviorSubject 或 replaySubject 来获取全局数据?这将使您可以从任何地方订阅它,并且它模拟它与模拟任何订阅相同。
-
@Ankit 这是其他人的现有代码。我只是为该代码编写单元测试。我不想对代码本身进行任何更改。
标签: javascript angular typescript unit-testing jasmine