我是Minitest/Cpybara/Selenium的新手。但我想测试我的销毁控制器操作。我正在尝试以下操作,但失败了
test "destroy" do
companies_count = Company.count
visit company_path(@company)
click_on "Delete"
page.driver.browser.switch_to.alert.accept
assert_equal (companies_count - 1), Company.count
end
输出:
test_destroy FAIL (2.17s)
Expected: 6
Actual: 7
也尝试过这种方式。
test "destroy" do
assert_difference('Company.count', -1) do
delete company_url(@company)
end
end
输出:
Minitest::UnexpectedError: NoMethodError: undefined method `delete' for #<CompaniesControllerTest:0x000056171e550038>
有人能帮我测试我的破坏行动吗?
假设您使用的是现代版本的Rails(5.2/6(和标准的系统测试配置(不在线程中运行并行测试(,那么Gregório Kusowski的回答中的问题就无关紧要了,因为DB连接是在测试和应用程序之间共享的,从而防止了测试无法看到应用程序更改的问题。
此外,假设您在这些系统测试中使用Selenium,您要处理的主要问题是浏览器中的操作与测试异步发生,因此,仅仅因为您告诉测试接受对话框并不意味着在返回时删除公司的操作已经完成。验证这一点的方法是在检查count
的变化之前只睡一会儿。虽然这会奏效,但这不是一个好的最终解决方案,因为它最终会浪费时间。相反,在验证新计数之前,您应该检查是否有指示操作已完成的视觉变化
test "destroy" do
companies_count = Company.count
visit company_path(@company)
accept_confirm do
click_on "Delete"
end
assert_text "Company Deleted!" # Check for whatever text is shown to indicate the action has successfully completed
assert_equal (companies_count - 1), Company.count
end
这是因为Capybara提供的断言具有等待/重试行为,允许应用程序在特定的时间内赶上测试的预期。
注意:我已经用Capybaras系统模式API的正确用法替换了page.driver...
——如果你使用page.driver...
,通常表明你做了一些错误的事情。
这很可能发生,因为您在测试中直接执行的操作发生在一个事务中,而您的web驱动程序正在触发另一个事务上发生的操作。你可以在这里阅读更多关于它是如何发生的:https://edgeguides.rubyonrails.org/testing.html#testing-平行交易
这里有一个类似的问题:使用selenium作为webdriver-can';t在中签名
正如Rails指南和类似问题中所述,您可能需要使用以下解决方案http://rubygems.org/gems/database_cleaner
如果你不想这样做,你的另一个选择是通过网络驱动程序验证你的操作是否成功,比如断言你列出的表中有6行是所有公司。