assert (minitest) 的 RSpec 等效语法是什么

What is the RSpec syntax equivalent for assert (minitest)

我正在关注 Michael Hartl 在 Rails 教程中的 Ruby。我观察到他使用 minitest 运行 他的测试。我使用 RSpec。下面是我想用 RSpec

复制的教程中的一行代码
test "email validation should accept valid addresses" do
  valid_addresses = %w[user@example.com USER@foo.COM A_US-ER@foo.bar.org
                     first.last@foo.jp alice+bob@baz.cn]
  valid_addresses.each do |valid_address|
    @user.email = valid_address
    assert @user.valid?, "#{valid_address.inspect} should be valid"
  end
end

这就是我将在 RSpec 中执行此操作的方式。

it "email validation should accept valid addresses" do
  valid_addresses = ["user@example.com", "USER@foo.COM", "A_US-ER@foo.bar.org",
                     "first.last@foo.jp", "alice+bob@baz.cn"]
  valid_addresses.each do |valid_address|
    user.email = valid_address
    expect(@user.valid?).to be true, "#{valid_address.inspect} is not correct"
  end
end

但是,当我 运行 这个测试时,我得到了 Argument error。看来 RSpec 在测试用例中只需要一个参数。

您收到的错误消息到底是什么。看起来你有错字。应该

user.email = valid_address

成为

@user.email = valid address

您提供了 2 个参数,而 expect 语句需要一个。

expect(@user.valid?).to be true

RSpec 认为您将一个参数传递给 to 方法,将两个参数传递给 be 方法,因此它给您一个错误。它将您的陈述视为:

expect(@user.valid?).to(be(true, "#{valid_address.inspect} is not correct"))

因此,您可以将规范更改为以下内容,它应该可以工作:

expect(@user.valid?).to be(true), "#{valid_address.inspect} is not correct"

在这里,RSpec 看到两个参数被传递给 to 方法,这是有效的。