2013-03-07 43 views
1

我有以下要求规范Rspec的规格上的更新操作失败

it "updates an open time" do 
    # Create an OpenTime 
    open_time = OpenTime.create(:start_time => (Time.now + 2.hours), :end_time => (Time.now + 10.hours)) 
    # Build an open_time update param 
    params = {:open_time => {:start_time => (Time.now + 5.hours)}} 
    # Send param to open_times#update 
    put open_time_path(open_time.id) , params 
    # Check to see if OpenTime was updated 
    open_time.should_receive(:update_attributes).with({:start_time => (Time.now + 5.hours)}) 
end 

这里是我的open_times控制器

def update 
    @open_time = OpenTime.find(params[:id]) 
    if @open_time.update_attributes(params[:open_time]) 
    flash[:success] = "Time updated." 
    redirect_to @open_time 
    else 
    render 'edit' 
    end 
end 

测试未能与预期:1好评:0

+2

尝试运行** open_time.should_receive(:update_attributes).with({:start_time =>(Time.now + 5.hours)})** **之前** put open_time_path(open_time.id),params ** – Kocur4d 2013-03-07 21:55:48

+0

仍然失败,出现同样的错误:( – 2013-03-07 23:00:01

回答

1

是不是那个会收到update_attributes的对象,而是由OpenTime.find返回的新对象,因此,您应该确保find返回您的对象:

OpenTime.stub(:find).and_return(open_time) 
open_time.should_receive(:update_attributes).with({:start_time => (Time.now + 5.hours)}) 

然后:

put open_time_path(open_time.id) , params 

additionaly,我将在测试开始时添加target_time = Time.now + 5.hours,然后使用PARAMS和匹配那个时候。

+0

谢谢!只需改变OpenTime.stub(:find).and_return(open_time) open_time.should_receive(:update_attributes!)。({“start_time”=>(Time。现在+ 5.hours).to_s})'并且它通过了! – 2013-03-08 01:24:03

1

由于kr1注意到您必须存储OpenTime.find方法以便在从控制器调用OpenTime时返回您的OpenTime实例。改变你的测试代码:

it "updates an open time" do 
    target_time = (Time.now + 5.hours) 
    # Create an OpenTime 
    open_time = OpenTime.create(:start_time => (Time.now + 2.hours), :end_time => (Time.now + 10.hours)) 

    # Build an open_time update param 
    params = {:open_time => {:start_time => target_time}} 

    # Stub OpenTime to return your instance 
    OpenTime.stub(:find).and_return(open_time) 

    # Set expectation on open_time to receive :update_attributes 
    open_time.should_receive(:update_attributes).with({:start_time => target_time}) 

    # Send param to open_times#update 
    put open_time_path(open_time.id) , params 
end 

你说这是怎么发生的事情是,你建立你的OpenTime(OPEN_TIME)的实例,并通过测试框架的OpenTime类“如果有人打电话找到的OpenTime类不运行找到,但只需返回open_time(刚刚创建的实例)“。然后,在您的实例上设置期望值以接收:update_attributes。当你打电话把open_time_path(open_time.id),参数您的控制器创建动作将处理请求和OpenTime.find(...)将返回您的实例(open_time)并调用:update_attribute。

希望它是有道理的。

+0

感谢您的帮助! – 2013-03-08 01:28:46