单元测试错误 - 预期对象({消息:'错误消息'})等于'错误消息'

时间:2021-02-18 11:31:15

标签: angular unit-testing karma-jasmine

我正在尝试编写一个单元测试,如果该方法失败则显示错误消息,但我收到此错误:

enter image description here

我不确定这是什么意思 - 这里的“错误消息”如何不等于“错误消息”?

it('should return error when unable to update Reconciliation Flag', (done) => {
    const id = '26949';
    const subPostingId = '0';
    const isReconciled = 'false';
    const errorResponse = { error: { message: 'error message' } };
    spyBmlService.get
        .withArgs(BmlRequest.SetReconciled, {
            bwtxnid: id,
            bwpostingid: subPostingId,
            isreconciled: isReconciled,
        })
        .and.returnValue(of(errorResponse));

    service.setReconciliationFlag(id, subPostingId, isReconciled).subscribe(
        () => {},
        (error: any) => {
            expect(error.message).toEqual('error message');
            done();
        }
    );
});

setReconciliationFlag 代码:

public setReconciliationFlag(
    id: string,
    subPostingId: string,
    isReconciled: string
): Observable<any> {
    return this.bmlService
        .get(BmlRequest.SetReconciled, {
            bwtxnid: id,
            bwpostingid: subPostingId,
            isreconciled: isReconciled,
        })
        .pipe(
            switchMap((response: any) => {
                if (!response.error) {
                    return of(response);
                } else {
                    return throwError({ message: response.error });
                }
            })
        );
}

3 个答案:

答案 0 :(得分:0)

这意味着您希望结果是“错误消息”,但是您得到了一个对象。所以你想要这个:

error message

相反,你得到了这个:

{message: 'error message'}

你只需要正确使用变量,所以可能是error.error.message

答案 1 :(得分:0)

您正在发出一个值:

.and.returnValue(of(errorResponse));

不和错误,因此在您的订阅中,您应该在以下位置收到该值:

service.setReconciliationFlag(id, subPostingId, isReconciled).subscribe(
        () => {}, // Here
        (error: any) => { // Not Here
            expect(error.message).toEqual('error message');
            done();
        }
    );

我可能遗漏了一些东西,因为我不知道服务内部的代码......无论如何检查你的间谍,因为它似乎不能正常工作并按你的意愿绕过调用。

我建议将 log.console 放在订阅的 value() 和 error() 函数中,以便您可以查看收到的内容,或在测试浏览器的 Chrome 开发工具中对其进行调试。

答案 2 :(得分:0)

让我们看看实现

...
switchMap((response: any) => {
      ...
      } else {
        return throwError({ message: response.error }); /// here you are building "error object"
      }
    })
);

并测试

const errorResponse = { error: { message: 'error message' } };
...
.and.returnValue(of(errorResponse));
...
(error: any) => {
   expect(error.message).toEqual('error message');

我不确定是实现不是很好还是测试中存在误解但产生的错误对象会像这样{ message: /* here starts what bmlService.get returns */ { message: 'error message' }}

因此,如果您确认实现非常好,您应该像这样修复断言

expect(error.message.message).toEqual('error message');