我正在学习编写单元测试,并且从我想测试的简单“计算器”类开始。 我想出了如何使用EXPECT / ASSERT函数,以及什么是测试用例等,但是当我想测试除以零时遇到了一个问题。有可能进行测试吗?我的意思是,我应该写什么作为测试结果?是否有类似“错误”的内容?还是我必须使用例外?
到目前为止,这是我的测试:
describe MyController, type: :controller do
before(:each) do
@var1 = FactoryGirl.create(:var1)
@var2 = FactoryGirl.create(:var2)
@var3 = FactoryGirl.create(:var3)
end
# todo
describe "#update" do
# @var1, @var2 and @var3 are being used in each test
it "should aaa" do
put :url1, params: { ... }
expect(response.status).to eql 200
r = JSON.parse(response.body)
expect(r["val1"]).to eql val
end
it "should bbb" do
put :url1, params: { ... }
expect(response.status).to eql 200
r = JSON.parse(response.body)
expect(r["val1"]).to eql val
end
it "should ccc" do
put :url1, params: { ... }
expect(response.status).to eql 200
r = JSON.parse(response.body)
expect(r["val1"]).to eql val
end
end
end
答案 0 :(得分:2)
我不同意@Ketzu。您期望当除以零时,计算器的表现如何。
EXPECT_EQ(, calculate.div(27,0));
在该测试中可能无法很好地表达这种期望。
如果calculate.div(27,0)
引发异常,那么您可以捕获此异常,并且如果未引发测试,则测试将失败。你可以这样写
TEST(ExceptionTest, ExpectThrowsSpecificException) {
try {
calculate.div(27,0);
FAIL() << "calculate.div(27,0) should throw an error, since a division by zero is not valid\n";
} catch (TestException& exception) {
EXPECT_THAT(std::string(exception.what()), Eq("VALID_SETTING"));
EXPECT_THAT(exception.errorCode, Eq(20));
}
}
有关详细讨论,请参见here。
如果没有引发异常,如何检测calculate.div
的异常用法?
答案 1 :(得分:1)
是否有可能进行测试?我的意思是,我应该写什么作为测试结果?是否有类似“错误”的内容?还是我必须使用例外?
这是您需要问(并回答)自己的核心问题-如果无效,计算器(在这种情况下,函数Calc::div()
)的行为应该如何给出strong>输入。它的行为方式有几种:
一旦您决定了自己的行为,就可以可以进行测试。
对于选项1 ,gtest提供了death tests。
对于选项2 ,您只需验证您是否获得了预期的结果即可。
对于选项3 ,您可以通过exception assertions或在try { } catch { }
末尾带有FAIL()
的自制try
捕获并评估异常阻止(因此您会注意到该函数是否在预期的时候未能引发异常)
答案 2 :(得分:0)
您的评论
我以为我可以测试
建议对测试有误解。
您的测试仅测试类的行为是否符合您的期望。 测试绝不是错误处理机制!
如果您的函数之一正在使用某些参数创建应用程序崩溃,那不是您的测试应标记为正确的东西。
有关如何解决它(异常和合适的宏)的信息,请参阅约翰的评论。