【问题标题】:Rpsec tests failed with 'rspec' but not with 'rspec path_of_the_file'Rpsec 测试因 'rspec' 而失败,但因 'rspec path_of_the_file' 而失败
【发布时间】:2013-12-06 11:34:13
【问题描述】:

如果我运行这个命令“rspec ./spec/requests/api/v1/password_reset_request_spec.rb”,这个文件中的所有测试都会通过。

但是,当我运行“rspec”时,我在这个文件中的测试失败了。

  1) /api/v1/password_reset #request when the email match with a runner when there is no request pending create a token for reset the password
 Failure/Error: post("/api/v1/password_reset/request", @params)
 NoMethodError:
   undefined method `reset_password' for RunnerMailer:Class
 # ./app/services/password_manager.rb:35:in `reset_password'
 # ./app/controllers/api/v1/password_reset_controller.rb:31:in `request_new_password'
 # ./spec/requests/api/v1/password_reset_request_spec.rb:108:in `block (5 levels) in <top (required)>'

这是调用方法的那一行:

 RunnerMailer.reset_password(@identity, @identity.reset_password_token).deliver

这是 RunnerMailer 类:

class RunnerMailer < ActionMailer::Base
  default from: "no-reply@goodgym.org"

  def reset_password(runner, token)
    @link = "http://url/password_reset/request/" + token
    mail(to: runner.email, subject: "Goodgym -- Reset your password")
  end
end

知道为什么当我执行 'rspec file_path' 而不是执行 'rspec' 时测试通过了吗?

编辑 1

我还有一个黄瓜功能,测试通过了。

谢谢

【问题讨论】:

  • 你试过rspec spec/requests/api/v1,如果成功的话,rspec spec/requests/api(等等)看看你是否可以缩小与之前运行的其他测试的关系?
  • 谢谢!事实上,是的,我在服务规范中存根这个模型,这就是它找不到方法的原因!
  • 但是一个规范中的变化不应该渗透到另一个规范中。你能说更多吗?
  • 是的,抱歉,事实上,对于我的服务规范,我试图避免需要 spec_helper 和 active_record 以进行更快的测试,所以在服务规范文件的顶部我有“class RunnerMailer; end”所以我猜这不是存根类的好方法。
  • 所以我现在不是在文件顶部做,而是在这个服务规范的 before(:each) 中做。但我不确定这是否是最好的方法。

标签: ruby-on-rails rspec actionmailer


【解决方案1】:

如果单个规范的执行成功,但同一规范在作为更大套件的一部分运行时失败,则表明其他测试的先前执行正在影响结果。

如果有问题的规范嵌套很深,就像在这种情况下,隔离问题的一种方法是从有问题的规范运行连续目录中的所有规范,直到导致失败。找到导致问题的目录后,您可以通过指定在失败测试之前运行的不同系列规范来进一步隔离,直到您隔离有问题的规范。

例如,在这种情况下,您将运行rspec spec/requests/api/v1,如果成功则运行rspec spec/requests/api,如果成功则运行rspec spec/requests

由于在正常情况下,RSpec 会小心回滚单个测试所做的任何更改(对 Ruby 运行时和数据库),干扰通常是由于某些代码在正常 RSpec 框架之外运行。一般来说,所有测试代码都应该包含在describe 块中。

【讨论】:

  • 扩展这个,我实际上创建了一个新文件夹并开始将文件移动到其中,即如果rspec spec/models/失败我创建一个新文件夹spec/models_a并开始将文件一个一个移动到其中,执行@ 987654327@ 每次,直到规范失败。同样,如果文件中的单个规范在单独执行时通过,请注释掉文件中的其他规范,然后取消注释,直到规范无法确定导致冲突的原因。
【解决方案2】:

对我来说,我有

  config.before(:all) do
    Rails.application.load_seed # loading seeds
  end

在我的rails_helper.rb 文件中,该文件在导致冲突的每个文件的开头加载我的种子。

我更改了代码以在套件的开头加载种子。

   config.before(:suite) do
        DatabaseCleaner.clean_with(:truncation)
        Rails.application.load_seed # loading seeds
   end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多