我正在开发Rails中的简单天气API。此API将提供给定日期的预测。预测将包含有关风,温度,相对湿度等的每小时数据。
我已经为预测实施了一个模型。预测与其他模型有关联“has_many”,例如Wind。我为Wind对象开发了以下模型:
class Wind < ApplicationRecord
belongs_to :forecast, foreign_key: true
validates_presence_of :period
validates :velocity, numericality: true, allow_blank: true
validates :direction, length: { maximum: 2 }, allow_blank: true
end
当我尝试使用TDD时,我已经实施了以下测试(其中包括):
class WindTest < ActiveSupport::TestCase
setup do
@valid_wind = create_valid_wind
@not_valid_wind = create_not_valid_wind
end
test 'valid_wind is valid' do
assert @valid_wind.valid?
end
test 'valid_wind can be persisted' do
assert @valid_wind.save
assert @valid_wind.persisted?
end
test 'not_valid_wind is not valid' do
assert_not @not_valid_wind.valid?
end
test 'not valid wind cannot be persisted' do
assert_not @not_valid_wind.save
assert_not @not_valid_wind.persisted?
end
test 'not_valid_wind has error messages for period' do
assert_not @not_valid_wind.save
assert_not @not_valid_wind.errors.messages[:period].empty?
end
test 'not_valid_wind has error messages for velocity' do
assert_not @not_valid_wind.save
assert_not @not_valid_wind.errors.messages[:velocity].empty?
end
test 'not_valid_wind has error messages for direction' do
assert_not @not_valid_wind.save
assert_not @not_valid_wind.errors.messages[:direction].empty?
end
private
def create_valid_wind
valid_wind = Wind.new
valid_wind.direction = 'NO'
valid_wind.velocity = 2
valid_wind.period = '00-06'
valid_wind.forecast_id = forecasts(:one).id
valid_wind
end
def create_not_valid_wind
not_valid_wind = Wind.new
not_valid_wind.velocity = 'testNumber'
not_valid_wind.direction = '123'
not_valid_wind
end
end
在我添加与预测的关联之前,这一系列测试已经过去了:
belongs_to :forecast, foreign_key: true
实际上,如果删除该行,则任何测试都会失败。但是在模型中使用该行,以下测试失败(它们是错误的,测试期望为真):
test 'valid_wind is valid' do
assert @valid_wind.valid?
end
test 'valid_wind can be persisted' do
assert @valid_wind.save
assert @valid_wind.persisted?
end
我试图理解为什么会这样。任何人都知道为什么那些测试失败了?另外,有没有适当的方法来测试关联?
提前谢谢。
答案 0 :(得分:0)
test 'valid_wind can be persisted' do
assert @valid_wind.save
assert @valid_wind.persisted?
end
这个测试几乎毫无价值,因为你只是测试测试设置是否正确,它没有告诉你测试中的应用程序。
相反,在模型测试中,您应该在每个验证的基础上进行测试:
test 'does not allow non numerical values for velocity' do
wind = Wind.new(velocity: 'foo')
wind.valid?
assert_match "is not a number", wind.errors.full_messages_for(:velocity)
end
test 'allows numerical values for velocity' do
wind = Wind.new(velocity: 3)
wind.valid?
refute(wind.errors.include?(:velocity))
end
测试传递值通常只是略微有用,但如果出现错误则可能很有价值。
在您的模型中,您并不需要担心设置完全有效的记录 - 无论如何,您的功能和集成测试都将涵盖在内。