Jest-测试组件方法中的变量

时间:2018-02-05 05:52:40

标签: javascript jasmine tdd enzyme jest

让我们说我有一个类组件有这样的东西:

export class Math extends React.Component {
    ...
    someComponentMethod = numb => {
        const sample = numb * 10 
        ...
        const result = numb -5
        return result
    }

是否可以在Jest中对sample变量进行测试断言?

2 个答案:

答案 0 :(得分:4)

无法为函数的私有内部编写断言。

我个人发现这个障碍鼓励更好的测试。通过仅测试公共API的正确性,您可以重构内部,而无需更新任何测试。现有测试继续强制执行内部更改。

针对内部行为编写测试可以轻松增加所测试代码的维护工作量。由于测试与源代码紧密耦合,因此在进行更改时需要更多关注。这也会降低测试的可靠性,因为测试的更多变化会增加测试本身出现错误的可能性。

如果您发现自己想要测试一些内部行为,那么可能是提取某些功能的好时机。在您的示例中,sample值计算可以提取为自己的纯函数:

export class Math extends React.Component {
    ...

    computeSampleValue(input) {
        return input * 10
    }

    someComponentMethod = numb => {
        const sample = this.computeSampleValue(numb)
        ...
        const result = numb -5
        return result
    }
}

现在,您可以断言用于计算sample值的任何逻辑都可以按预期用于各种输入。这种逻辑提取通常使someComponentMethod更具可读性。

如果您绝对需要测试其他一些内部行为并且知道增加的代码债务,那么您可以让您的方法执行副作用并为其编写断言。例如,不是将sample定义为函数范围变量,而是在组件实例上创建this.sample属性并更新它。在测试中,然后调用目标方法,然后声明componentInstance.sample已按预期更改。

答案 1 :(得分:-1)

我已经设法通过以下方式测试函数中的某个变量值:

sum1.js


#include<memory>
#include<vector>
#include<iostream>

class A{

private:
  std::vector<std::shared_ptr<int>> x_vec;

public:
  A(std::vector<int>* a_val){
    std::cout << "Creating A instance with a vec = ";
    for(int i = 0; i < a_val->size(); ++i){

      x_vec.emplace_back(std::make_shared<int> (a_val[i])); //offending line
      std::cout << *x_vec[i] << " ";
    }
    std::cout << std::endl;
  };
};

int main()
{
  // define vector called x
  std::vector<int> x;
  // number of ints in x
  int n_x = 5;
  // fill x
  for(int nx = 0; nx < n_x; ++nx){
    x.push_back(nx);
    std::cout << "x " << nx << " is " << x[nx] << std::endl;
  }
  // create instance of A
  A a(&x);
  return 0;
}

sum1.test.js

function sum() {
    result = 1 + 2;
 };

module.exports = sum;

希望它会有所帮助,加油!