首页 > 解决方案 > 试图了解 Rails 测试的工作原理并遇到模型问题

问题描述

使用https://guides.rubyonrails.org/testing.html学习如何开发自动化测试。我运行 rails db:test:prepare 然后编辑了默认值./test/model/user_test.rb(我有一个用户模型)。这个测试看起来很简单,但我收到以下错误:

Mysql2::Error: 字段 'screen_name' 没有默认值

这应该是正确的,因为我要求该字段不是 Null 并且我不想要默认值。我想输入一个值。数据库模式就是这样设置的。

无论我做什么,我都会收到此错误。我尝试运行默认控制器测试并得到相同的错误。

由于没有真实的描述,我想推断这个测试的真正作用。也许这不是一个有效的测试只是一些脚手架?

因未输入值而失败的测试当然是我最终需要的测试。似乎我没有从本指南中获得所需的指导,是否有更好的起点。

我尝试了以下方法:

@User = users.new
@User.screen_name = "Name"
...
@User.save

得到了相同的结果,似乎只是对这个模型运行测试试图在我做任何事情之前创建一个空表条目。真的吗?如果是这样,我该如何处理它并且不提供任何默认值。

默认控制器测试得到完全相同的结果。

./test/model/user_test.rb:

require 'test_helper'

class UserTest < ActiveSupport::TestCase
   test "the truth" do
     assert true
   end
end

MySQL 表描述:

mysql> desc users;
+-----------------+--------------+------+-----+---------+--------------
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+--------------
| id              | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| screen_name     | varchar(255) | NO   |     | NULL    |                |
| email           | varchar(255) | NO   |     | NULL    |                |
| password_digest | varchar(255) | NO   |     | NULL    |                |
| created_at      | datetime     | NO   |     | NULL    |                |
| updated_at      | datetime     | NO   |     | NULL    |                |
+-----------------+--------------+------+-----+---------+--------------

我不知道会发生什么,但我没想到我得到了什么。多年来,我学会了从默认开始并建立起来。

在进程 15156 中通过 Spring 预加载器运行运行选项:--seed 50091

跑步:

错误:UserTest#test_the_truth: Mysql2::Error: Field 'screen_name' doesn't have a default value bin/rails test/models/user_test.rb:4 完成时间为 0.006803 秒,146.9987 次运行/秒,0.0000 次断言/秒。1 次运行,0 次断言,0 次失败,1 次错误,0 次跳过

标签: mysqlruby-on-railstesting

解决方案


User这是因为您在表上声明了 null 错误条件。Rails 会在运行每个测试之前加载所有夹具,因此当运行夹具时test/fixtures/users.yml,Rails 会引发错误,因为夹具没有数据库所需的值。

解决这个问题的方法是要么删除夹具:要么在夹具test/fixtures/users.yml内添加正确的、必要的值。

遵循该指南时会自动生成夹具。这就是我知道您为用户提供的方式。

它可能看起来像:

user:
  id: 1
  screen_name: Spongebob Squarepants # this might be missing!
  email: squidwards_bestie@thebottomofthesea.com

推荐阅读