我有一个带有 devise/cancan 的应用程序和一个典型的 restful 产品控制器,具有以下操作:
def new
@product = Product.new
end
在products_controller_spec.rb
我这样测试它:
describe "GET 'new'" do
it "returns http success" do
Product.should_receive(:new)
get 'new'
end
end
如果我在没有 cancan 的情况下运行测试,它会按预期工作并通过。如果我添加 cancan load_and_authorize_resource
,我会收到以下错误:
Failure/Error: Product.should_receive(:new)
(<Product(id: integer, tenant_id: integer, product_category_id: integer, tax_category_id: integer, brand_id: integer, name: string, description: string, order_quantity: decimal, size: decimal, decimal: decimal, items_per_unit: integer, created_at: datetime, updated_at: datetime) (class)>).new(any args)
expected: 1 time
received: 2 times
我必须通过at_least(:one)
最后添加来绕过它(所以它看起来像Product.should_receive(:new).at_least(:once)
并且它再次通过)。
为什么会这样?和康康有关系吧?为什么 cancan 调用它两次,有没有更好的方法来测试它?
当我添加 cancan 时,我在控制器测试中遇到各种错误,我开始想知道 cancan 在做什么,我有这种奇怪的行为。
我已经测试了用户的能力,并且我已经编写了许多没有问题的集成测试。
最后一件事:我在登录的测试之上有一个 before 块,并提供了访问控制器的正确角色/权限,如下所示:
let!(:tenant) { create(:tenant) }
let!(:role) { Role.where(name: "Admin", tenant_id: tenant.id).first }
let!(:user) { create(:user, role: role, tenant: tenant) }
before do
Tenant.current_id = tenant.id
user.confirm!
sign_in(user)
end
有没有办法绕过cancan(比如skip_authorize_resource
在测试中以某种方式调用),因为我想测试控制器方法本身,而不是能力和角色。