0

想象一下我有这样的路线:

resource :users do
  resource :projects
do

项目.rb

...
belongs_to :users
...

用户.rb

...
has_many :projects
...

如果我想为 Project 创建 rspec 测试,我会在没有 User 的情况下单独测试 Project 吗?理论上永远不会有没有用户的项目,因为用户创建了一个项目。像这样的东西:

project_spec.rb

...
  it "is created by a user"
...

或者

user_spec.rb

...
it "create a project"
...

如果我想对用户创建项目进行测试,我会在 user_spec 中还是在 project_spec 中进行测试?或两者?

4

1 回答 1

1

我通常使用模拟来隔离和提高速度。这些规范只测试到用户对象的边界,并且不会触及数据库或对项目模型做任何实际的事情。他们测试行为而不是状态

(以下使用 RSpec 2.11 特性)

describe User do
  let(:project){ mock_model(Project) }

  subject(:user){ User.new(:project => project) }

  it "does something with a project" do
    project.should_receive(:some_method_call).and_return(:a_value)
    user.do_something
  end

end

describe User do
  let(:fake_project_class) { Class.new }
  let(:project){ double('a_project') }

  subject(:user){ User.new }

  before(:each) do
    stub_const("Project", fake_project_class)
  end

  it "creates a project" do
    Project.should_receive(:new).and_return(project)
    user.make_me_a_project!
  end
end
于 2012-08-08T05:57:17.737 回答