Ruby on rails Rails Rspec测试控制器新动作
我正在尝试在控制器中测试新操作。目前看起来是这样的: 控制器Ruby on rails Rails Rspec测试控制器新动作,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我正在尝试在控制器中测试新操作。目前看起来是这样的: 控制器 def new @business = Business.new @business.addresses.build end 规格 我想测试行'@business.addresses.build'。我该怎么做 提前谢谢 怎么样 expect(assigns(:business).addresses.first).to be_a_new(Address) 假设build是一种方法,您只需要测试以确保调用build。您可以将新
def new
@business = Business.new
@business.addresses.build
end
规格
我想测试行'@business.addresses.build'。我该怎么做
提前谢谢 怎么样
expect(assigns(:business).addresses.first).to be_a_new(Address)
假设build是一种方法,您只需要测试以确保调用build。您可以将新的
业务
替换为具有地址
属性的模拟,该属性预期接收:build
我还没有对此进行测试,但我怀疑您可以执行以下操作:
我认为您需要创建一个模拟对象。尝试检查
@business.addresses
的存在。在什么情况下,这段代码会失败?我不会这样做,因为这是测试实现而不是结果。如果将build
更改为new
,该怎么办?结果是一样的,但是你的测试会失败。这是真的!这是一个非常脆弱的测试,但他确实问过如何测试那条特定的线路。也许更大的问题是为什么这条线甚至在控制器中。是否应该将其移动到构造函数?对不起,我是rails新手。我理解什么是构造函数,但是不确定应该在何处使用mvc模式实现它。是否将其放入模型中并从控制器调用?在业务定义中,您可以定义一个名为initialize
的函数,该函数充当业务的端点。新建(…)
。在您的情况下,它可能包含地址。如果您知道所有业务实例都应该生成地址,则生成。太好了,这很有意义。谢谢你的建议。谢谢,这是我需要的。
expect(assigns(:business).addresses.first).to be_a_new(Address)
business = double('business')
addresses = double('addresses')
business.should_receive(:addresses).and_return(addresses)
addresses.should_receive(:build)
Business.stub(:new).and_return(business)