Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails Rspec测试控制器新动作_Ruby On Rails_Ruby_Rspec - Fatal编程技术网

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)