为什么我的Rspec发布:创建无效的参数控制器测试失败?

我的控制器有两个测试。

spec/controllers/employees_controller_spec.rb it 'should create a new valid employee' do employee_params = FactoryGirl.attributes_for(:employee) expect { post :create, employee: employee_params }.to change(Employee, :count).by(1) should redirect_to(action: :index) end it 'should not save an employee with an invalid avatar extention' do invalid_employee_params = FactoryGirl.attributes_for(:employee) invalid_employee_params[:avatar] = Rack::Test::UploadedFile.new(File.open(File.join(Rails.root, '/spec/fixtures/photos/duck.txt'))) expect { post :create, employee: invalid_employee_params }.to_not change(Employee, :count).by(1) end 

当我执行这些测试时,第一个测试通过而第二个测试失败。 以下是错误:

 Failure/Error: expect { post :create, employee: invalid_employee_params }.to_not change(Employee, :count).by(1) NotImplementedError: `expect { }.not_to change { }.by()` is not supported # ./spec/controllers/employees_controller_spec.rb:38:in `block (3 levels) in ' 

我已经按照Rspec文档中的Rspec文档进行了操作 ,这对我来说似乎是正确的。 这看起来像一个简单的错误修复,但我不太清楚发生了什么。 有人可以帮助指出我的错误。 我是Rspec的新手。

很好地看错误,看起来你不能使用by matcher来测试to_not change 。 直观地说,你应该只是期望它不会改变计数。 你不应该测试它不会改变1,因为如果计数改变0或2,那个测试就会通过,我想这会导致许多误报

这有用吗?

 expect { post :create, employee: invalid_employee_params }.to_not change(Employee, :count)