使用Pact与Angular。
在运行测试时得到以下错误.Error: MockService的实际交互与预期交互不匹配。
Missing requests:
GET /dogs
测试中的代码:dog.service.ts
@Injectable({
providedIn: 'root'
})
export class DogService {
constructor(private http: HttpClient) {
}
getDogs(baseUrl: string): Observable<Dog[]>{
return this.http.get<Dog[]>(baseUrl + '/dogs');
}
}
Spec文件。
import {TestBed} from '@angular/core/testing';
import {HttpClientModule} from '@angular/common/http';
import {PactWeb, Matchers} from '@pact-foundation/pact-web';
import { DogService } from './dog.service';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import {Pact} from '@pact-foundation/pact';
describe('Dog service contract tests', () => {
let provider: PactWeb;
let dogService: DogService;
beforeAll(async (done) => {
provider = new PactWeb({
port: 1234,
host: '127.0.0.1',
log: '.\\log\\pact.log',
logLevel: 'warn',
dir: '.\\pacts',
spec: 2
});
// required for slower CI environments
setTimeout(done, 2000);
// Required if run with `singleRun: false`
await provider.removeInteractions();
console.log('Pact web creation');
});
afterEach(async () => {
await provider.verify();
console.log('Verify');
});
afterAll(async () => {
return await provider.finalize();
console.log('Finalize');
});
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [
DogService
]
});
console.log('Configure test module');
});
describe('Contract tests', () => {
beforeAll(async () => {
// set up Pact interactions
await provider.addInteraction({
state: 'dogs exist',
uponReceiving: 'get all dogs',
withRequest: {
method: 'GET',
path: '/dogs'
},
willRespondWith: {
status: 200,
headers: {
'Content-Type': 'application/json; charset=utf-8'
},
body: Matchers.eachLike({
avatar: Matchers.like('xyz'),
title: Matchers.like('German Shepard'),
subTitle: Matchers.like('This is German Shepard'),
imageUrl: Matchers.like('xyz'),
description: 'Lorem ipsum'
}, {min: 2}),
},
});
console.log('Add interaction');
});
it('Dog details exist', async () => {
dogService = TestBed.inject(DogService);
console.log(provider.mockService.baseUrl);
dogService.getDogs(provider.mockService.baseUrl).subscribe((response) => {
expect(response).toBeDefined();
console.log(response);
});
});
});
});
可能是什么问题?
Package.json:"@pact-foundationkarma-pact"。"^2.3.1", "@pact -foundationpact": "^9.11.0", "@pact-foundationpact-node": "^10.9.4", "@pact-foundationpact-web": "^9.11.0",
错误信息是说它从来没有收到那个HTTP调用,所以这就是这里的主要漏洞。
你对getDogs的调用是一个承诺,然而你并没有返回它或等待它,所以很可能这个调用从未被发出。
我的猜测是,你需要正确处理承诺,这样测试就不会在调用之前退出。