【问题标题】:Jest Testing with React Native and Contentful使用 React Native 和 Contentful 进行 Jest 测试
【发布时间】:2018-12-11 17:35:11
【问题描述】:

我正在尝试使用 Jest 测试我的 React Native 应用程序。我使用 Contentful 作为 CMS 来保存我的后端信息。我目前正在尝试测试我正在初始化正确的客户端。

这是我用来初始化客户端的代码:

var client = contentful.createClient({
  space: 'w20789877',  // whatever the space id is 
  accessToken: '883829200101001047474747737' // some accessToken
})

这是我用来测试初始化​​客户端的代码:

describe ('should initialize the correct client', () => {(
   it('should initialize the correct client info from contentful', () =>{
      expect(client).toEqual('w20789877', '883829200101001047474747737')
});
)};

但是,我收到一条错误消息,指出:

Difference: Comparing two different types of values. Expected undefined but received string.

由于某种原因,我收到未定义的空间和 accessToken,但我正确初始化了客户端,因为我稍后可以使用该空间。即使在尝试打印空间和 accessToken 时,也会打印一个未定义的值。

【问题讨论】:

    标签: javascript reactjs react-native jestjs contentful


    【解决方案1】:

    这里有几个问题:

    1. toEqual匹配器接收单值参数;你发送 2 参数,因此实际上只使用了第一个参数。
    2. 在这种情况下,client 是一个函数,您正试图将其与字符串进行比较。不管客户端不是字符串这一事实,在您的情况下它也是undefined,因此消息“预期未定义但收到字符串”。你这里不是在测试空间或者accessToken,你是在测试客户端。

    我不完全确定您要在这里测试什么,但这与 Contentful 没有特别的关系。

    我假设客户端初始化部分位于您想要进行单元测试的代码中(而不是在测试文件中初始化)。我建议进行一个测试,检查contentful 的createClient 函数在执行代码时是否使用您预期的参数被调用;无需测试客户端是否已创建 - Contentful 有责任确保它们返回有效的客户端对象。重要的是您传递应用所需的正确“space”和“accessToken”参数。

    一般来说,外部服务应该是mock的,你应该只测试你自己的逻辑和与外部服务的交互。

    示例

    为简单起见,假设初始化客户端的代码如下所示:

    //client.js
    
    var contentful = require('contentful')
    
    export default function initializeClient() {
        var client = contentful.createClient({
          space: 'w20789877',  // whatever the space id is 
          accessToken: '883829200101001047474747737' // some accessToken
        });
    }
    

    测试可能如下所示:

    //client.test.js
    
    describe('contentful client', () => {
        let contentful;
        let initializeClient;
    
        beforeEach(() => {
            jest.mock('contentful');
    
            contentful = require('contentful');
            initializeClient = require('./client').default;
        });
    
        it('should initialize the contentful client with the correct params', async () => {
            initializeClient();
            expect(contentful.createClient).toHaveBeenCalledWith({
                space: 'w20789877',
                accessToken: '883829200101001047474747737'
            });
        });
    });
    

    注意:我并没有实际运行或测试上述代码,但这是一般概念。

    【讨论】:

    • 感谢您的帮助!我能够运行和测试代码。但是,测试失败说明:expect(jest.fn()).toHaveBeenCalledWith(expected) Expected mock function to have been called with: [{"accessToken": "883829200101001047474747737", "space": "w20789877"}] But it was not called.
    • 正如我所说,这只是一个例子。很难说。测试失败,因为没有调用该函数。您的实现是否有可能实际上没有执行调用?
    • 是的,我的实现正在执行调用。
    • 您的方向是正确的,您需要找出问题所在。尝试在代码中添加一些日志,看看客户端对象是否是您的测试中的模拟对象,看看它甚至到达了初始化代码,并且没有其他问题阻止它到达客户端初始化,例如 - 可能还有其他问题需要嘲笑
    • 我认为 createClient 可能需要被嘲笑??我该怎么做?/看看这是否是问题
    猜你喜欢
    • 2018-09-07
    • 2020-07-17
    • 1970-01-01
    • 2020-06-01
    • 2021-09-20
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 2017-02-25
    相关资源
    最近更新 更多