Angular 单元测试 - 存根复杂对象
Angular Unit Testing - stub complex object
在我的单元测试中,我必须创建具有大量属性的存根。
所以我会有这样的界面:
interface Person {
id: string;
name: string;
age: number
...
}
然后我将不得不创建一个实现此接口的对象并将一些值传递给每个 属性。
Jasmine 没有接收接口和 returns 具有默认值的对象的函数吗?
在上面的例子中,我会得到:
const stub: Person = createStubObj<Person>();
stub.id // ""
stub.name // ""
stub.getAge // 0
我做了一些研究,但没有发现任何有用的东西。
createSpyObj 似乎对我没有帮助,因为我没有任何我想监视的功能。该对象只有属性。
当 HTTP 请求 returns 复杂对象(许多属性、嵌套属性)时,可能会发生这种情况。我想知道在那种情况下如何模拟该对象,而不需要为每个 属性.
指定一个值
类似于这个库正在做的事情:https://www.npmjs.com/package/ts-auto-mock#usage
我想知道这是否也可以在 Jasmine 中实现,或者是否有更好的方法
我倾向于创建特定的模拟对象,这些对象可以使用 TestBed 提供程序注册注入到被测组件中:
TestBed.configureTestingModule({
providers: [
TestComponent,
{ provide: RealInterfaceType, useValue: new MockObjectType() }
]
});
然后您可以在模拟对象中定义适当的 属性 值。同样,您可以通过设置间谍来使用模拟对象作为依赖服务的响应:
serviceSpy = jasmine.createSpyObj('SomeService', ['someFunction']);
serviceSpy.someFunction.and.returnValue(new MockObjectType());
对于http调用,我一般测试如下...
let injector: TestBed;
let service: TestService;
let httpMock: HttpTestingController;
const expectedResponse: TestObject = new TestObject();
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [
TestService
});
injector = getTestBed();
service = injector.get(TestService);
httpMock = injector.get(HttpTestingController);
});
afterEach(() => {
httpMock.verify();
});
describe('someFunction', () => {
it('should return an Observable<UserAuthResponse>', () => {
service.someFunction().subscribe(response => {
expect(response).toBe(expectedResponse);
});
const req = httpMock.expectOne('http://the-expected-url');
expect(req.request.method).toBe('GET');
// return the static expected value
req.flush(expectedResponse);
});
});
这只是在测试预期的 http 方法,不过 URL。
在我的单元测试中,我必须创建具有大量属性的存根。
所以我会有这样的界面:
interface Person {
id: string;
name: string;
age: number
...
}
然后我将不得不创建一个实现此接口的对象并将一些值传递给每个 属性。 Jasmine 没有接收接口和 returns 具有默认值的对象的函数吗?
在上面的例子中,我会得到:
const stub: Person = createStubObj<Person>();
stub.id // ""
stub.name // ""
stub.getAge // 0
我做了一些研究,但没有发现任何有用的东西。
createSpyObj 似乎对我没有帮助,因为我没有任何我想监视的功能。该对象只有属性。
当 HTTP 请求 returns 复杂对象(许多属性、嵌套属性)时,可能会发生这种情况。我想知道在那种情况下如何模拟该对象,而不需要为每个 属性.
指定一个值类似于这个库正在做的事情:https://www.npmjs.com/package/ts-auto-mock#usage
我想知道这是否也可以在 Jasmine 中实现,或者是否有更好的方法
我倾向于创建特定的模拟对象,这些对象可以使用 TestBed 提供程序注册注入到被测组件中:
TestBed.configureTestingModule({
providers: [
TestComponent,
{ provide: RealInterfaceType, useValue: new MockObjectType() }
]
});
然后您可以在模拟对象中定义适当的 属性 值。同样,您可以通过设置间谍来使用模拟对象作为依赖服务的响应:
serviceSpy = jasmine.createSpyObj('SomeService', ['someFunction']);
serviceSpy.someFunction.and.returnValue(new MockObjectType());
对于http调用,我一般测试如下...
let injector: TestBed;
let service: TestService;
let httpMock: HttpTestingController;
const expectedResponse: TestObject = new TestObject();
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [
TestService
});
injector = getTestBed();
service = injector.get(TestService);
httpMock = injector.get(HttpTestingController);
});
afterEach(() => {
httpMock.verify();
});
describe('someFunction', () => {
it('should return an Observable<UserAuthResponse>', () => {
service.someFunction().subscribe(response => {
expect(response).toBe(expectedResponse);
});
const req = httpMock.expectOne('http://the-expected-url');
expect(req.request.method).toBe('GET');
// return the static expected value
req.flush(expectedResponse);
});
});
这只是在测试预期的 http 方法,不过 URL。