Rails测试和摩卡:如何存根特定模型 - 条件any_instance?

Rng*_*Tng 4 ruby unit-testing ruby-on-rails mocha.js

我想存根只是一个特定的模式,但不是唯一的一个特定的对象,不是每个实例

例如给定具有属性'name'(字符串)和'cool'(布尔值)的类'Person'.我们有两种型号:

person_bill:
   name: bill
   cool: false

person_steve:
   name: steve
   cool: false
Run Code Online (Sandbox Code Playgroud)

现在我想要只是史蒂夫,这工作正常:

p1 = people(:person_steve)
p1.stubs(:cool? => true)
assert p1.cool? #works
Run Code Online (Sandbox Code Playgroud)

但是,如果我再次从DB加载Model,它不会:

p1 = people(:person_steve)
p1.stubs(:cool? => true)
p1 = Person.find_by_name p1.name
assert p1.cool? #fails!!
Run Code Online (Sandbox Code Playgroud)

这有效,但也影响比尔,不应该:

 Person.any_instance.stubs(:cool? => true)
 assert people(:person_bill).cool? #doesn't fails although it should
Run Code Online (Sandbox Code Playgroud)

那么我怎么能只是史蒂夫存根,但无论如何?是否有条件的any_instance之类的

 Person.any_instance { |p| p.name == 'Steve' }.stubs(:cool? => true)
Run Code Online (Sandbox Code Playgroud)

提前致谢!

mix*_*nic 7

为什么不直接生成对象的方法?

Person.stubs( :find_by_name ).
       returns( stub(:cool? => true) )
Run Code Online (Sandbox Code Playgroud)

我认为这是正确的(而且简单的)答案.我很确定没有像any_instance语法那样的东西.您可能会在序列语法中找到有用的东西:

你能再举一个你想要的例子吗?祝好运!

  • 深度代码的解决方案是浅薄:-).在TDD或良好的单元测试中,您希望避免复杂的代码和深度嵌套.如果难以测试,最好的方法不是复杂代码的复杂测试.更好地简化/重新分解代码并编写简单的测试! (2认同)