reactjs中组件的单元测试功能使用业力和茉莉花

Posted

技术标签:

【中文标题】reactjs中组件的单元测试功能使用业力和茉莉花【英文标题】:Unit test function of component in reactjs using karma and Jasmine 【发布时间】:2017-07-09 08:12:23 【问题描述】:

我有一个 reactjs 组件,并且该组件内有一个函数。我想为此编写单元测试用例。下面是我的示例单元测试用例。函数名称是 getNewGroupName

describe("CreateGroupName component", () => 

      it("Correct Copy name should be generated for first copy", () => 
          component = ReactTestUtils.renderIntoDocument( < CreateGroupName reactor = 
              reactor
             > < /CreateGroupName>);

            expect(component.getNewGroupName("SampleGroupName")).tobe("SampleGroupName - Copy(1)")
          );

      );

但是当我运行单元测试用例时,我遇到了错误

TypeError: undefined is not a constructor (evaluating 'e.getNewGroupName("SampleGroupName")')

使用调试器查看对象后,我只能看到该对象的以下属性。

我还尝试使用酶库编写上述测试。但是两者都在结果中给了我相同的对象。

 it("Correct Copy name should be generated for first copy", () => 
            const wrapper = enzyme.mount(<CreateGroupName reactor=reactor></CreateGroupName>);
            const inst = wrapper.instance();
            expect(inst.getNewGroupName('SampleGroupName')).toBe("SampleGroupName - Copy(1)");
        );

这是我的组件

堆栈跟踪如下

"TypeError: t.getNewGroupName is not a function
    at Object.<anonymous> (http://localhost:9876/base/app/spec/webpack.loader.js:96:18873)
    at attemptSync (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1886:24)
    at QueueRunner.run (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1874:9)
    at QueueRunner.execute (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1859:10)
    at Spec.queueRunnerFactory (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:697:35)
    at Spec.execute (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:359:10)
    at Object.fn (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:2479:37)
    at attemptAsync (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1916:24)
    at QueueRunner.run (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1871:9)
    at http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1898:16"

【问题讨论】:

CreateGroupName 组件是什么样的?这通常发生在它没有正确返回某些东西时。 .toBe() 代替 .tobe() 怎么样? 我已更正此问题,但仍无法正常工作 你的代码中e.getNewGroupName("SampleGroupName")在哪里? 【参考方案1】:

ReactTestUtils.renderIntoDocument() 渲染一个 DOM 节点,表示组件在渲染后的输出。见https://facebook.github.io/react/docs/test-utils.html#renderintodocument

您似乎正在尝试调用 getNewGroupName(),它是您的 React 组件上的一个函数,而不是渲染的 DOM 节点上的一个方法。

【讨论】:

有没有办法测试组件的功能?或者那是不可能的 看看 Jest (facebook.github.io/jest) 以帮助对 React 组件进行单元测试。另请查看 Enzyme (airbnb.io/enzyme) 以获取渲染组件的帮助,然后针对渲染结果进行断言。然后,您可以使用 renderresult.instance().yourfunction() 来调用组件上的方法。看看这里:github.com/airbnb/enzyme/issues/208 如果你检查我的单元测试用例的第二个样本,我正在做同样的事情,但它失败了

以上是关于reactjs中组件的单元测试功能使用业力和茉莉花的主要内容,如果未能解决你的问题,请参考以下文章

用业力/茉莉花写测试

将角种子茉莉花单元测试转换为咖啡脚本

Angular 2 业力设置问题——业力启动但不运行测试

茉莉花匹配器功能未在 angularjs/karma 单元测试中加载

带有茉莉花的AngularJS 2单元测试组件面临错误,无法读取null的属性'firstChild'

业力开始找不到模块'茉莉花核心'