2

我正在研究 Michael Hartl rails 教程。运行测试时,出现以下错误:

Error:
UserTest#test_associated_microposts_should_be_destroyed:
ArgumentError: unknown command 'a'
test/models/user_test.rb:73:in 'test'
test/models/user_test.rb:73: in 'block in <class:UserTest>'

“test/models/user_test.rb”如下:

test "associated microposts should be destroyed" do
@user.save
@user.microposts.create!(content: "Lorem ipsum")
assert_difference 'Micropost.count', -1 do
@user.destroy
end

该测试很简单,仅旨在测试我的模型(user.rb)中的以下行

has_many :microposts, dependent: :destroy

如果我将这句话评论如下:

has_many :microposts#, dependent: :destroy

正如预期的那样,我得到

Failure: [...] "Micropost.count" didn't change by -1. Expected:38 Actual 39.

如果我取消注释“dependent: :destroy”语句,我会收到这个“未知命令”错误。任何人都可以就如何最有可能生成此错误提供一些指导,什么是 rails 上下文中的“命令”(不包括 rails 控制台)以及首先在哪里尝试解决它(模型?控制器?)。谢谢。

4

3 回答 3

2

您的 assert_difference 调用中有错字。

assert_difference 'Micropost.count" ...

注意开始的单引号和结束的双引号。

于 2015-04-12T23:11:20.230 回答
0

我重新处理了我的代码,并通过删除每个测试注意到即使失败日志中只报告了一个测试,我也可以通过分别删除位于测试底部的两个不同测试之一来摆脱失败文件如下:

test "associated microposts should be destroyed" do
@user.save
@user.microposts.create!(content: "Lorem ipsum")
assert_difference 'Micropost.count', -1 do
  @user.destroy
end

test "authenticated? should return false for a user with nil digest" do
   assert_not @user.authenticated?(:remember, '')
  end
end
.
. 

问题是“结束”之一放错了位置。该文件应该是:

test "associated microposts should be destroyed" do
@user.save
@user.microposts.create!(content: "Lorem ipsum")
assert_difference 'Micropost.count', -1 do
  @user.destroy
end
end
test "authenticated? should return false for a user with nil digest" do
   assert_not @user.authenticated?(:remember, '')
end

我仍然有兴趣了解为什么失败日志检索到“未知命令'a'”以提高我对未来 Rails 测试环境的理解。

于 2015-04-13T11:52:12.957 回答
0

我刚才有同样的问题,有这个;

在顶部micropost_test.rb有这个设置

//first post creation for @user
def setup
    @user = users(:michael)
    # This code is not idiomatically correct.
    @micropost = @user.microposts.build(content: "Lorem ipsum")
end

//second post creation in test for @user
test "associated microposts should be destroyed" do
    @user.save
    @user.microposts.create!(content: "Lorem ipsum")
    assert_difference 'Micropost.count', -1 do
    @user.destroy
end

已经创建了一个帖子,因此当用户在测试中与另一个帖子一起保存时,该用户实际上被删除了 2 个与他一起发布的帖子。所以我们期望的应该是-2的差异。

于 2016-12-29T00:51:56.097 回答