gpt4 book ai didi

ruby-on-rails - rails 中 mock 和 stubs 的实际例子

转载 作者:太空宇宙 更新时间:2023-11-03 16:25:32 25 4
gpt4 key购买 nike

有足够多的问题与这个主题相关,但没有一个提供实用示例来说明差异。

根据Fowler 的文章,模拟不是 stub , stub 是独立于外部调用的假方法,而模拟是对调用具有预编程 react 的假对象。

Stub 不能使您的测试失败,但 Mock 可以。

Mocking is more specific and object-related: if certain parameters are passed, then the object returns certain results. The behavior of an object is imitated or "mocked".

Stubbing is more general and method-related: a stubbed method usually returns always the same result for all parameters. The behavior of a method is frozen, canned or "stubbed".

让我们来看一个简单的测试案例。我们必须找到一本提供了 id 并与用户相关的 Book

  it "can find an Book that this user belongs to" do 
project = Book.find( id: '22', email: user@test.com )
expect(project) to eq(some_data);
end

在上面的例子中……什么是stub,什么是mock?如果我的示例无效,任何人都可以向我展示模拟 stub 的示例

最佳答案

让我们举两个例子:

let(:email) { 'email' }

# object created from scratch
let(:mocked_book) { instance_double Book, email: email }
it 'check mock' do
expect(mocked_book.email).to eq email
end

#
let(:book) { Book.new }
it 'check stub' do
allow(book).to receive(:email) { email }
expect(book.email).to eq email
end

你的例子不是那么相关:你不会测试事件记录,但你可能需要 stub 它返回一个 mock

假设您需要测试一本书接收一个方法,例如:

def destroy
@book = Book.find(params[:id])
if @book.destroyable?
@book.destroy
else
flash[:error] = "errr"
end
redirect_to books_path
end

您可以使用以下代码进行测试:

it 'is not destroyed if not destroyable' do
mocked_book = double 'book', destroyable?: false
allow(Book).to receive(:find).and_return mocked_book
expect(mocked_book).to_not receive :destroy
# here goes the code to trigger the controller action
end

it 'is destroyed if destroyable' do
mocked_book = double 'book', destroyable?: true
allow(Book).to receive(:find).and_return mocked_book
expect(mocked_book).to receive :destroy
# here goes the code to trigger the controller action
end

你可以在这里看到优缺点:

  • 缺点:mock 必须确切知道预期的方法是什么

  • 优点:使用模拟,您不需要真正创建对象并设置它以使其适合某些条件

关于ruby-on-rails - rails 中 mock 和 stubs 的实际例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25251153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com