是否可以在节点中编写笑话单元测试以获得没有catch块的承诺?

时间:2019-04-06 20:47:53

标签: node.js reactjs unit-testing jestjs redux-saga

出了什么问题

我正在尝试使用用户登录来编写基本的django样板。我正在使用pdf.js处理登录流程。

我有一个传奇,它调用登录功能,该功能对服务器执行ping操作并获得令牌。传说处理所有错误处理。如果该调用失败,则错误将成功返回以做出反应并显示给用户。它可以正常工作。

我正在尝试为登录功能编写单元测试。我认为节点正在捕获我的错误:ssh-keygen -t ed25519 -C "your-email-id@gmail.com"

我想是因为saga在现实中抓住了它,所以节点不会抛出该错误。

这是否意味着我无法对登录功能应引发未捕获的错误进行单元测试?

我应该不麻烦测试吗?

代码

这是调用服务器的功能。

ssh-add ~/my-pc/Desktop/.ssh/ed25519

这就是处理逻辑的传奇。

react-saga

这是我的单元测试:

UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().

1 个答案:

答案 0 :(得分:1)

您可以对其进行测试。 toThrow方法用于捕获引发的错误,但是Promise拒绝错误,因此需要使用不同的API。为了同样捕获错误.rejects.toThrow();,您应该await结束期望块,从而导致:

describe("login function", () => {
    let mock;

    beforeEach(() => {
        mock = new MockAdapter(axios);
        localStorage.clear();
    });

    afterEach(() => {
        // We need to clear mocks
        // and remove tokens from local storage to prevent
        // us from staying logged in
        mock.restore();
    });

    test("Check that exception thrown on server error", async () => {
        // Mock loggedin function to throw error
        mock.onPost().reply(500);
        Test that error is uncaught.
        await expect(() => auth.login("test@example.com", "pass")).rejects.toThrow(); // add an error message to check for correct error
    });
});

PS。 jest API docs中对此进行了详细记录。