gpt4 book ai didi

ruby-on-rails - 在使用 capybara 进行集成测试时,在 rspec 中使用 mocha 模拟 api 调用

转载 作者:行者123 更新时间:2023-12-04 05:40:44 27 4
gpt4 key购买 nike

基本上发生的事情是当我在我的 rspec 规范中进行集成测试时,我正在测试重置密码功能,并且我正在使用第三方 api 调用来发送电子邮件。我想信任第三方 api 发送电子邮件并完全忽略响应。

这是我现在正在使用的代码,但它仍然在发送电子邮件并且失败,因为根据 Mocha,对 send_password_reset(包含第三方 api 调用的位置)的调用是“未”调用的

before(:each) do
@client = Factory(:user_with_clients).clients.first
end

it 'should send out the email(mock) set a temporary password and take them back to the login page' do
# WHEN THE MOCK WAS MOVED HERE THE SPEC PASSSED
visit '/client_portal/reset_password/new'
fill_in 'email', with: @client.email
click_button 'Send password reset'
# THIS NEEDED TO BE MOVED TO THE TOP OF THE FUNCTION
Client.expects(:send_password_reset).returns(true)
current_path.should eq('/client_portal/login')
page.should have_content('Check your email')
@client.reload
@client.tmp_password.should_not eq(nil)
end

我不认为发布用于创建它的工厂会揭示任何其他内容,但您认为这会帮助您帮助我我会这样做。

我也尝试将 Cilent.expects 更改为 @client.expects,但我仍然遇到同样的问题。我不依赖于 Mocha 框架,因为这实际上是我做过的第一个模拟。

我还读到我不应该在集成测试中模拟对象,但我不知道在调用测试时不发送电子邮件的方法。

只是想我应该在那里添加 Controller Action ,以防万一我应该改变那里的东西......
def create
client = Client.find_by_email(params[:email])
if client
client.set_tmp_password
if client.send_password_reset
redirect_to '/client_portal/login', notice: 'Check your email for the password reset link'
else
redirect_to '/client_portal/login', notice: 'There was an error resetting your password. Please try one more time, and contact support if it doesn\'t work'
end
else
flash.now[:notice] = 'No account with that email address was found'
render :new
end
end

我在运行测试时收到此错误
  1) Reset a users password user is not logged in valid email address supplied should send out the email(mock) set a temporary password and take them back to the login page
Failure/Error: Client.any_instance.expects(:send_password_reset).returns(true)
Mocha::ExpectationError:
not all expectations were satisfied
unsatisfied expectations:
- expected exactly once, not yet invoked: #<AnyInstance:Client(id: integer, first_name: string, last_name: string, email: string, password_digest: string, signup_charge: decimal, monthly_charge: decimal, active: boolean, created_at: datetime, updated_at: datetime, monthly_charge_day: integer, sold_by_user_id: integer, tmp_password: string)>.send_password_reset(any_parameters)
# ./spec/requests/client_portal/reset_password_spec.rb:14:in `block (4 levels) in <top (required)>'

解决方案

使用来自@Veraticus 的以下代码并将其移至规范的顶部解决了该问题。

最佳答案

问题是你没有调用 send_password_reset类上的方法;你在那个类的一个实例上调用它。用这个:

 Client.any_instance.expects(:send_password_reset).returns(true)
clientClient.find_by_email 找到将正确设置期望值。

关于ruby-on-rails - 在使用 capybara 进行集成测试时,在 rspec 中使用 mocha 模拟 api 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11270601/

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