让我们说我有一个类组件有这样的东西:
export class Math extends React.Component {
...
someComponentMethod = numb => {
const sample = numb * 10
...
const result = numb -5
return result
}
是否可以在Jest中对sample
变量进行测试断言?
答案 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;
希望它会有所帮助,加油!