【问题标题】:Using RSpec, how can I test that a method is called with instance of a class but with specific values on specific attributes?使用 RSpec,我如何测试使用类的实例调用方法,但使用特定属性的特定值?
【发布时间】:2012-08-19 10:25:04
【问题描述】:

我想写一个如下的测试:

account = Account.find(1)
@controller.should_receive(:authorize!).with(:create, instance_of(User, :account_id => account.id))

(在我的控制器上测试cancan gem 的确切示例)

我知道:account_id => account.id 部分无效。

我的问题在这里:

如何调用instance_of,同时测试实例的属性是否具有特定值?

我希望这很清楚。否则,请告诉我,我怎样才能说得更清楚。

提前致谢

帕纳约蒂斯

【问题讨论】:

  • 你想测试什么?控制器加载正确的实例?如果然后是这样的: Account.should_receive(:find).returns(account)) @controller.should_receive(:authorize!).with(account) 如果这是我想要的,请告诉我一个正式回复:D
  • 啊啊啊。是的。我认为这是正确的答案。 (虽然我相信我应该稍后再检查)。但是,是的,请将其发布为您的官方答案。谢谢。

标签: ruby-on-rails-3 rspec2 rspec-rails


【解决方案1】:

你想测试什么?控制器加载正确的实例并将正确的实例传递给:authorize!?如果是,那么类似:

Account.should_receive(:find).returns(account))
@controller.should_receive(:authorize!).with(account)

会做的工作

【讨论】:

  • 对不起,@nikos-d 这不是正确的答案。我对你的评论的评论不是经过深思熟虑的。我必须检查该实例是否属于具有account_id 属性上的特定参数值的用户类型,而不是它是否是帐户的特定实例。
【解决方案2】:

您可以使用块来更好地控制预期的参数,更多信息: Argument matchers

【讨论】:

【解决方案3】:

要扩展已接受的答案,可以使用argument matchers 执行以下操作:

expect(controller).to receive(:authorize!).with do |symbol, received_user|
  expect(symbol).to eq :create
  expect(received_user).to be_a User
  expect(received_user.account).to eq account
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 2019-03-13
    • 1970-01-01
    相关资源
    最近更新 更多