【问题标题】:Angular Testing of GET request that requires an Authentication Service需要身份验证服务的 GET 请求的角度测试
【发布时间】:2017-12-03 20:33:30
【问题描述】:

我是 Karma/Jasmine 测试的新手,我正在尝试为我的服务设置一个执行 GET 请求的测试。我正在使用带有 MockBackend 对象的 XHRBackend 来模拟虚假请求和响应。我有一个执行 GET 的“webService”和一个保存连接字符串和访问令牌的“authService”。我将此测试设置如下:

describe('WebService Tests', () => {

    beforeEach(async(() => {
        TestBed.configureTestingModule({
            imports: [HttpModule],
            providers: [
                AuthService,
                AdalService,
                WebServicesService,
                { provide: XHRBackend, useClass: MockBackend }
            ]
        })
        .compileComponents();
    }));

beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => {
            backend = be;
            authService = new AuthService(new AdalService(), http);
            webService = new WebServicesService(http, authService);
            fakeWebServicesData = makeServicesData;
            let webOptions = new ResponseOptions({status: 200, body: {data: fakeWebServicesData}})
            webResponse = new Response(webOptions);
        }));

        it('should have expected successful GET of WebServices', async(inject([], () => {
            backend.connections.subscribe((c: MockConnection) => c.mockRespond(webResponse));

            webService.getWebServices().toPromise()
            .then(data => {
                expect(data.length).toBe(fakeWebServicesData.length,
                'should have received all web services data');
            })

        })))

我收到的响应是失败的,因为 data.length 未定义,并且预期为 1(我使用的假数据长度为 1)。我有点不确定为什么会这样。它调用的方法如下:

getWebServices(): Observable<WebService[]> {
        let connection = this.authService.connection + '/services';
        // Add authorization header with jwt token
        let token = this.authService.getToken();
        let headers = new Headers({ 'Authorization': 'Bearer ' + token });
        let options = new RequestOptions({ headers: headers });

        // Get services from web service api endpoint
        return this.http.get(connection, options)
            .map((response: Response) => response.json())
            .catch((error: Response) => {
                return Observable.throw(error);
            });
    }

我怀疑是因为在我发出模拟请求之前我还没有使用 AuthService 登录,所以它可能返回未定义。在设置此模拟请求之前,我是否需要使用我的 authService 登录? (例如,事先进行模拟登录?)如果是这样,我如何在同一测试中连续执行两个模拟请求?还是有其他方法来伪造身份验证?任何帮助,将不胜感激。非常感谢。

更新: 这是我的假数据

const makeServicesData = [
    { 
        name: "service1", version: "1.0.0", versionPublishedBy: "",
        creationTime: "", snapshotId: "", runtimeType: "",
        initCode: "", code: "", description: "", operationId: "",
        inputParameterDefinitions: [
            { name: "", type: "" }
        ],
        outputParameterDefinitions: [
            { name: "", type: "" }
        ],
        outputFileNames: [""],
        myPermissionOnService: "read/write"
    }
]

【问题讨论】:

  • 你确定你的假数据的长度是 1 吗?如果在您的测试数据中等于{data: fakeWebServicesData},那么长度将是未定义的。
  • 是的,我的假数据在数组中只有一项。我将使用虚假数据更新我上面的问题,以便您查看。 @mahulst

标签: angular unit-testing integration-testing karma-jasmine


【解决方案1】:

您应该将期望更改为 data.data.length。您命名为 data 的结构将包含{ data: [ ...actual data ] }。我还建议将其重命名为响应或其他内容。但是你能验证这是否有效吗?:

it('should have expected successful GET of WebServices', async(inject([], () => {
        backend.connections.subscribe((c: MockConnection) => c.mockRespond(webResponse));

        webService.getWebServices().toPromise()
        .then(data => {
            expect(data.data.length).toBe(fakeWebServicesData.length,
            'should have received all web services data');
        })

    })))

【讨论】:

  • 不,这行不通。它需要一个对象数组。数组是第一个数据。
猜你喜欢
  • 2019-09-16
  • 1970-01-01
  • 2023-03-24
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多