首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在AngularJS 2中使用AuthHttp模拟http调用

在AngularJS 2中使用AuthHttp模拟http调用
EN

Stack Overflow用户
提问于 2016-10-13 18:21:55
回答 1查看 514关注 0票数 3

在我的Angular 2.0.0应用程序中,我试图在使用AuthHttp而不是Http的服务中模拟HTTP调用。

代码语言:javascript
复制
@Injectable()
export class FundingPlanService {
  constructor(private http: AuthHttp);

  getFundingPlans(): Observable<FundingPlan[]> {
    return this.http.get('http://localhost:8080/api/fundingplans')
      .map((response: Response) => {
        return response.json();
      }).map((json: any) => {
        // some logic here
        return fundingPlans;
      });
  }
}

在测试中,我打乱了网上到处都能找到的零碎东西,如下所示:

代码语言:javascript
复制
describe('Service: FundingPlan', () => {
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        FundingPlanService,
        MockBackend,
        BaseRequestOptions,
        {
            provide: Http,
            useFactory: (backend, options) => new Http(backend, options),
            deps: [MockBackend, BaseRequestOptions]
        },
        {
            provide: AuthHttp,
            useFactory: (http) => new AuthHttp(new AuthConfig(), http),
            deps: [Http]
        }
      ]
    });
  });

  it('should ...', inject([FundingPlanService, MockBackend], fakeAsync((service: FundingPlanService, backend: MockBackend) => {
    backend.connections.subscribe((connection: MockConnection) => {
      expect(false).toBe(true);
      expect(connection.request.method).toBe(RequestMethod.Get);
      expect(connection.request.url).toBe('http://localhost:8080/api/fundingplans');
    });

    let fundingPlans = service.getFundingPlans();
  })));
});

Http使用MockBackendAuthHttp使用带有mocked后端的Http

代码语言:javascript
复制
LOG: '*** const ', AuthHttp{http: Http{_backend: MockBackend{connectionsArray: ...

但是expect语句永远不会执行。只是为了确认一下,我已经添加了expect(false).toBe(true);,但是使用SUCCESS完成了测试。

我遗漏了什么?

EN

回答 1

Stack Overflow用户

发布于 2016-10-13 22:00:06

第一个问题:

你错过了你的请求的异步行为,有多种方法可以实现异步测试:

通过将测试包装在async区域中:

代码语言:javascript
复制
it('should ...', async(inject([FundingPlanService, MockBackend], (service: FundingPlanService, backend: MockBackend) => {
    ... 
    ...
    }));

使用done()回调参数:

代码语言:javascript
复制
it('should ...', (done) => {inject([FundingPlanService, MockBackend], (service: FundingPlanService, backend: MockBackend) => {
      ...
      ...
      done();
    }});

您使用了fakeAsync,但这是用于假异步计时器,这里您显式地使用了异步调用,因此您应该使用这两种方法中的一种。

第二个问题:

你订阅了连接后端,因为你从来不调用http,订阅连接后端应该用来指定你想要在模型中得到哪个响应:

代码语言:javascript
复制
it('should ...', async(inject([FundingPlanService, MockBackend], (service: FundingPlanService, backend: MockBackend) => {
    backend.connections.subscribe((connection: MockConnection) => {
        const options: ResponseOptions = new ResponseOptions(
                {
                    body   : "Your body as string",
                    headers: new Headers(),
                    status : 200
                }
            );
            conn.mockRespond(new Response(options));
    });
    //And then your expectations
    expect(service.getFundingPlans()).toBe(dunnoWhat);
}));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40018332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档