gpt4 book ai didi

ruby-on-rails - 使用 mocha 测试许多条件

转载 作者:数据小太阳 更新时间:2023-10-29 08:12:40 25 4
gpt4 key购买 nike

使用 mocha gem 测试如下方法的最佳方法是什么?

def can_create?(user)
opened? && (owner?(user) || member?(user))
end

测试“AND”和“OR”条件的最佳做法是什么?我应该创建许多测试来涵盖所有可能性,还是应该创建涵盖所有可能性的选项?


我正在使用 Rails 4 + 测试单元。

例如,当我只使用 && 进行测试时:

def can_update?(user)
opened? && owner?(user)
end

我正在测试:

group = Group.new
user = User.new
group.expects(:opened?).returns(true)
group.expects(:owner?).returns(true)
assert group.can_update?(user)

问题是当我有“或”条件时。使用第一种方法(can_create?)我不能这样做:

group = Group.new
user = User.new
group.expects(:opened?).returns(true)
group.expects(:owner?).returns(true)
group.expects(:member?).returns(true)
assert group.can_create?(user)

因为( owner? 和 member? 方法可以是 true/false )。

最佳答案

我的第一个猜测是编写几个测试:

test 'with opened and owner' do
group = Group.new
user = User.new
group.expects(:opened?).returns(true)
group.expects(:owner?).returns(true)
assert group.can_create?(user)
end

test 'with opened and member' do
group = Group.new
user = User.new
group.expects(:opened?).returns(true)
group.expects(:owner?).returns(false)
group.expects(:member?).returns(true)
assert group.can_create?(user)
end

test 'with opened and not member or owner' do
group = Group.new
user = User.new
group.expects(:opened?).returns(true)
group.expects(:owner?).returns(false)
group.expects(:member?).returns(false)
assert group.can_create?(false)
end

然后你可以重构你的测试以获得更清晰的东西,所以你想使用 stub 而不是期望来避免 OR 问题:

def assert_can_create(params, expected)
group = Group.new
user = User.new
group.stubs(:opened?).returns(params[:opened])
group.stubs(:owner?).returns(params[:owner])
group.stubs(:member?).returns(params[:member])

assert group.can_create?(expected)
end

test 'can_create possibilities' do
assert_can_create({opened: true, owner: true, member:true}, true)
assert_can_create({opened: true, owner: true, member:false}, true)
assert_can_create({opened: true, owner: false, member:true}, true)
assert_can_create({opened: true, owner: false, member:false}, false)
assert_can_create({opened: false, owner: true, member:true}, false)
[...]
end

毕竟这个例子没那么长。如果你有很多条件,你可能想要像 Aupajo 这样的东西。但我认为您最终会自己编写,因为您会有一些特定的需求。

问候

关于ruby-on-rails - 使用 mocha 测试许多条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18477013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com