2

我发现that stackoverflow old post建议model_entity.send(:before_create)但现在不起作用。那么,我该如何测试应该执行的方法before create, update, destroy.There还有另一个post,但我无法弄清楚,我应该怎么做我的情况。使用Rspec测试Rails的ActiveRecord before_create方法

class User < ActiveRecord::Base 

    before_create do |user| 
    user.secure_token = UUID.new.generate 
    end 
end 

重点是我可以用这个代码做一个方法,然后调用它。还有其他方法吗?一般来说,如果我想测试after_create方法,那只有在我的模型中,我应该创建模型对象并检查它。但是,我想,这是不必要的行动。我可以在不创建任何实例的情况下检查此方法。

回答

2

如果使用的是RSpec的,我猜你可以这样做:

@user = User.new 
@user.should_receive(:secure_token) 
@user.save 
+0

所以,如果它不应该接受它抛出的东西吗?我怎样才能形成它作为测试。 '前(:每个)做 @user = User.new 结束 它 “应该有一个secure_token” 做 @ user.should_receive(:secure_token) @ user.save end' – zishe

+0

我的意思是https://开头要点.github.com/3744451 – zishe

+0

有一个错误发生https://gist.github.com/3744693 – zishe

3

刚刚发现了一些猫腻。如果需要验证实际结果,请单独验证,因为如果使用.should_receive(:secure_token=),则当前rspec不会传递函数:secure_token=的返回值。例如:

型号如上:

describe "verifies that secure_token= is called" do 
    @user = User.new 
    @user.should_receive(:secure_token=) 
    @user.save 
end 

describe "verifies the result is set" do 
    @user = User.new 
    @user.save 
    expect(@user.secure_token).not_to be_empty 
end 

但是,如果你把希望不要在同一个测试的should_receive空的,那么会导致测试失败。

4

有这样的干法:

expect{ user.save }.to change{ user.secure_token }