Testing/Validating ExMachina 中的工厂变更集和可重复模式测试
Testing/Validating Factory changesets & Repeatable Schema Testing in ExMachina
这不是问题,我只是想确保这段代码对测试有我认为的效果。我想通过工厂测试 builds/creates 结构并检查以确保变更集有效,就像默认生成的测试一样。这样我的工厂也经过测试以生成有效数据。
例如,此默认测试使用属性映射来创建结构变更集并验证数据:
@valid_attrs %{
email: "some@email.com",
first_name: "some content",
last_name: "some content",
password: "some content",
password_hash: "some content",
username: "some content",
mobile: "1112223333"}
@invalid_attrs %{}
test "changeset with valid attributes" do
changeset = User.changeset(%User{}, @valid_attrs)
assert changeset.valid?
end
能不能用工厂改写成这样?
test "changeset with ExMachina Factory attributes" do
user = build(:user)
changeset = User.changeset(user,%{})
assert changeset.valid?
end
在我学习 Elixir 的过程中,有时语义令人困惑,我希望得到一些澄清,这是正确的方向。正在传递一个空的属性映射,因为它们已经由工厂 build(:user)
函数在 user
中定义,正确验证了变更集?
我的下一步是做一些像我在 Rails/Rspec/FactoryGirl 中所做的事情,我有一个 FactorySpec 构建每个模型并验证模型是否正确构建。在此示例中,工厂规范构建每个模型并对其进行验证。
#spec/models/factory.rb
FactoryGirl.factories.map(&:name).each do |factory_name|
describe "The #{factory_name} factory" do
it 'is valid' do
build(factory_name).should be_valid
end
end
end
#spec/models/post_spec.rb
require 'rails_helper'
RSpec.describe Post, type: :model do
end
#spec/models/user_spec.rb
require 'rails_helper'
RSpec.describe User, type: :model do
end
最后,关于如何在 ExUnit 中创建一个 spec/test 可重复测试所有结构,使用它们各自的工厂来验证它们的 build/create
代,有什么建议吗?
我也有一个 issue (198) open in the ExMachina 回购以供交叉参考。
ExMachina
文档有一个名为 params_for
的函数,它生成属性映射。这样,除了由 Phoneix 脚手架模型生成器创建的测试之外,还可以添加测试。
test "changeset with valid factory" do
changeset = User.changeset(%User{}, params_for(:user) )
assert changeset.valid?
end
这不是问题,我只是想确保这段代码对测试有我认为的效果。我想通过工厂测试 builds/creates 结构并检查以确保变更集有效,就像默认生成的测试一样。这样我的工厂也经过测试以生成有效数据。
例如,此默认测试使用属性映射来创建结构变更集并验证数据:
@valid_attrs %{
email: "some@email.com",
first_name: "some content",
last_name: "some content",
password: "some content",
password_hash: "some content",
username: "some content",
mobile: "1112223333"}
@invalid_attrs %{}
test "changeset with valid attributes" do
changeset = User.changeset(%User{}, @valid_attrs)
assert changeset.valid?
end
能不能用工厂改写成这样?
test "changeset with ExMachina Factory attributes" do
user = build(:user)
changeset = User.changeset(user,%{})
assert changeset.valid?
end
在我学习 Elixir 的过程中,有时语义令人困惑,我希望得到一些澄清,这是正确的方向。正在传递一个空的属性映射,因为它们已经由工厂 build(:user)
函数在 user
中定义,正确验证了变更集?
我的下一步是做一些像我在 Rails/Rspec/FactoryGirl 中所做的事情,我有一个 FactorySpec 构建每个模型并验证模型是否正确构建。在此示例中,工厂规范构建每个模型并对其进行验证。
#spec/models/factory.rb
FactoryGirl.factories.map(&:name).each do |factory_name|
describe "The #{factory_name} factory" do
it 'is valid' do
build(factory_name).should be_valid
end
end
end
#spec/models/post_spec.rb
require 'rails_helper'
RSpec.describe Post, type: :model do
end
#spec/models/user_spec.rb
require 'rails_helper'
RSpec.describe User, type: :model do
end
最后,关于如何在 ExUnit 中创建一个 spec/test 可重复测试所有结构,使用它们各自的工厂来验证它们的 build/create
代,有什么建议吗?
我也有一个 issue (198) open in the ExMachina 回购以供交叉参考。
ExMachina
文档有一个名为 params_for
的函数,它生成属性映射。这样,除了由 Phoneix 脚手架模型生成器创建的测试之外,还可以添加测试。
test "changeset with valid factory" do
changeset = User.changeset(%User{}, params_for(:user) )
assert changeset.valid?
end