Rails在模块内存储变量

时间:2018-02-19 11:29:02

标签: ruby-on-rails-3 unit-testing rspec mocha

我为这个模块编写了一个单元测试,并希望存储来自应用程序控制器的current_account变量。 (它在应用程序控制器中编写的全局方法)

Module Foo
 def querying_result(criteria)
  User.find_by_account(current_account).where(criteria: criteria)
 end
end

我尝试了以下

Foo.stubs(current_account: @user.account).returns(@user.account)
Foo.any_instance.stub(current_account:@user.account).and_return(@user.account)

我的测试文件

class FooTest << ActiveSupport::TestCase
  context "querying the result"
    setup do
    @user = User.first
  end
  should "return all users" do
    users = querying_result(criteria)
    assert_equal users.count, 1
  end
end

我在这里错过了什么?

1 个答案:

答案 0 :(得分:0)

从我看到Foo模块可能直接包含在FooTest中。

这很奇怪,但为了使它成功,你应该(只能猜测)存根self而不是Fooself.stubs...)。

但这不是你应该如何测试模块的。

IMO应测试包含此模块的类。如果您不想将测试与任何特定课程联系起来 - 请在规范中创建一个。

@dummy_class = Class.new do
   include Foo
   def initialize(current_account)
     @current_account = current_account # you can control this now by injecting the account on object creation
   end
   attr_accessor :current_account
end

并在测试

之类的东西
@foo = @dummy_class.new(@user)
assert_equal(@foo.querying_result(criteria).count, 1)

您也可以跳过initialize部分,只删除@foo对象。