Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails minitest测试框架如何在rails中工作?_Ruby On Rails_Ruby_Ruby On Rails 3_Ruby On Rails 4_Minitest - Fatal编程技术网

Ruby on rails minitest测试框架如何在rails中工作?

Ruby on rails minitest测试框架如何在rails中工作?,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,minitest,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,Minitest,我刚开始学习使用minitest进行测试,但这听起来让我很困惑。这句话是什么意思 test 'should not save simulations without name' do post = Post.new assert !post.save, 'Saved the simulations without a name' end 后模型 我试过: test 'Post must have all parameters' do assert assigns(:one).valid?

我刚开始学习使用
minitest
进行测试,但这听起来让我很困惑。这句话是什么意思

test 'should not save simulations without name' do
 post = Post.new
 assert !post.save, 'Saved the simulations without a name'
end
后模型 我试过:

test 'Post must have all parameters' do
assert assigns(:one).valid?
结束

在创建Post的新对象时,检查名称、类型参数是否存在 班级。考完试后我怎么做

这个测试方法是不是在检查邮件中是否有姓名

有点。断言检查保存新的Post实例是否失败,但导致该结果的原因有多个-例如缺少
:name
:type
属性,创建之前的
过滤器可能劫持保存操作

如果您想单独测试这些验证中的每一个,那么您需要从一个已知的有效Post记录开始,并操纵它以触发每个验证失败。通常,我会在我的fixture文件中设置至少一条最低限度有效的记录——在这种情况下,我将其称为
:mvp
。例:

test 'MVP is valid' do
  assert posts(:mvp).valid?, 'Minimum valid Post is invalid'
end

test 'should not save simulations without name' do
  post = posts(:mvp)
  post.name = nil
  assert post.invalid?, 'Post is valid without a name'
end

...
在大多数情况下,我发现测试简单的验证(存在性、简单的数值性等)会让我的测试变得杂乱无章,而且有点像测试框架而不是我自己的应用程序代码,所以我经常会跳过它们

如何通过PostTest类测试check_验证

check\u validation
被标记为私有方法,通常不希望直接测试私有方法。但是,您可以验证在新创建的模型上设置的条件是否符合您的期望:

test 'newly created Post has settings XYZ' do
  post = Post.new(...)
  assert post.save, 'Post could not be saved'
  # assertions to test #check_validations side effects here...
end
你没有包括你的
check\u validation
方法的主体,所以我不知道你在想什么。尽管有这样一个名称,我倾向于相信您正在尝试进行某种验证,最好由使用
validate
方法定义的自定义验证方法进行验证。查看文档以了解其是否适用于您的案例

如果帖子不属于用户,如何检查抛出错误

我会在你的博士后课程中确认这一条件:

class Post
  belongs_to :user
  validates  :user, presence: true
end

希望这能有所帮助。我试图以一种能让你继续工作的方式回答你的问题,但是如果你对学习Rails和Minitest的高效性感兴趣,你会想对框架以及它如何与Rails一起使用进行更深入的研究。

这是一个写得很差的测试,所以我可以理解你为什么感到困惑。我假设有一个伴随测试,它试图显示
Post
在有名称时可以保存

test 'should save simulations with name' do
  post = Post.new name: 'simulator McSimulation'
  assert post.save, 'Must save the simulations with a name'
end

test 'should not save simulations without name' do
  post = Post.new
  assert !post.save, 'Saved the simulations without a name'
end
这句话是什么意思

test 'should not save simulations without name' do
 post = Post.new
 assert !post.save, 'Saved the simulations without a name'
end
这是一种测试方法。在Minitest中有三个主要概念:测试类、测试方法和断言方法

测试班 测试类是从
Minitest::test
继承的类。它可以直接从中继承:

class PostTest < Minitest::Test
end
Rails添加了一些语法,因此可以通过将字符串和块传递给
test
方法来创建测试方法:

class PostTest < ActiveSupport::TestCase
  test "is valid" do
    # do the testing here
  end
end
2) 调用
save
实际上会将数据发送到数据库,这很慢,应该尽可能避免。使用
valid?
而不是
save

test 'must not be valid without name' do
  post = Post.new
  refute post.valid?, 'Must be invalid without a name'
end
3) 确保模型无效的原因是因为测试的原因,特别是它需要一个名称。此模型无效且无法保存的原因有很多。我们需要在这里更具体一些。指定此IMO的最佳方法是检查模型的
errors
对象是否包含缺少名称的原因

test 'must not be valid without name' do
  post = Post.new
  refute post.valid?, 'Must be invalid without a name'
  assert post.errors[:name].any?, 'Must be invalid for missing name'
end
当然,我们可以通过指定由
post.errors[:name]
返回的值来使其更加具体。让我们使用断言集合包含特定值的
assert\u includes
assertion方法:

test 'must not be valid without name' do
  post = Post.new
  refute post.valid?, 'Must be invalid without a name'
  assert_includes post.errors[:name], "can't be blank",
                  'Must be invalid for missing name'
end

希望能有所帮助。

我强烈推荐克里斯·科托姆的《迷你烹饪书》。看看该书吧。该语句所做的只是创建一个新的post实例,而不是设置任何属性并试图保存它。然后它断言它没有保存,如果它确实保存了,则显示消息“保存了没有名称的模拟”。Chris感谢这一解释,但当我应用
赋值
时,它说没有方法未定义的方法赋值检查
编辑-1
部分我是个白痴。你应该使用
posts(:one)
,而不是
赋值(:one)
。我错了,很抱歉误导了你。今天早上还没有足够的咖啡。顺便说一句,Rails 5将实现一个不同的take-on实例变量,并在发布时弃用
assigns
方法,因此如果您已经使用edge Rails,这对您来说是不可用的——即使在控制器测试中,它也会被适当地用于当前的Rails版本中。非常感谢!这真的很有帮助:)一个问题:你的第一个案例失败了,而第二个案例通过了。两者都建议使用相同的方法,即我们可以保存帖子,而我们的名称是否为
post。保存
还取决于其他
存在
参数?这就是它失败的原因吗?您想知道模型可以保存,也可以不保存。或者可以是有效的,也可以是无效的。保存/有效的标准取决于相关对象。但是你应该有一个测试,测试结果表明,有足够正确的标准,模型是有效的。然后对每种可能无效的方式进行一系列测试。这样,如果有什么变化,你就有了良好的测试覆盖率,告诉你哪些期望没有得到满足。我刚开始学习小测验。如果我们重构您的上一个测试,使其看起来像这样呢<代码>测试“无名称不得有效”执行以下操作
post=post.new
断言post.invalid?
断言post.errors[:name]。任何?,“post无效,无名称”
结束
test 'should not save simulations without name' do
  post = Post.new
  refute post.save, 'Saved the simulations without a name'
end
test 'must not be valid without name' do
  post = Post.new
  refute post.valid?, 'Must be invalid without a name'
end
test 'must not be valid without name' do
  post = Post.new
  refute post.valid?, 'Must be invalid without a name'
  assert post.errors[:name].any?, 'Must be invalid for missing name'
end
test 'must not be valid without name' do
  post = Post.new
  refute post.valid?, 'Must be invalid without a name'
  assert_includes post.errors[:name], "can't be blank",
                  'Must be invalid for missing name'
end