如何解决使用 MiniTest 的 Rails 测试服务对象
我试图理解 Rails 6 中的 MiniTest 以使用它而不是 RSpec。实际上,我发现的所有材料都涉及两件事:控制器和模型测试,它们不涉及服务对象这样重要的事情。我有下面的服务对象,它只更新三个用户字段 - status、status_updated_at 和 failed_attempts。为了简化示例,我将省略其余条件。
class FailedAttributes
def initialize(user)
@user = user
end
def call
transaction do
user.class.update_counters(user.id,failed_attempts: 1)
user.update(status: 'inactive',status_updated_at: DateTime.now)
end
end
RSpec 测试很简单,但是如何使用 MiniTest 编写它?我很简单:
require 'test_helper'
class FailedAttributesTest < ActiveSupport::TestCase
setup do
@user = users(:registered)
end
end
以及如何传递 @user
变量来运行类并检查 @user
是否已更新?
解决方法
Minitest 实际上只是一个非常简单的 TDD 设置,对于如何编写测试几乎没有意见。
Minitest::Test
没有内置的等效于 let/let!
或 RSpec 中的隐式主题。相反,依赖项通常在 setup
块中设置:
require 'test_helper'
class FailedAttributesTest < ActiveSupport::TestCase
# Arrange
setup do
@user = users(:registered)
@service = FailedAttributes.new(@user)
end
def test_does_something
# Act
@service.call
# Assert
assert_equals(@user.reload.foo,'bar')
end
end
如果您想创建类似于 RSpec 中的 let
的记忆化辅助方法,您可以:
require 'test_helper'
class FailedAttributesTest < ActiveSupport::TestCase
def test_does_something
# Act
service.call
# Assert
assert_equal(user.reload.foo,'bar')
end
private
def user
@user ||= users(:registered)
end
def service
@service ||= FailedAttributes.new(user)
end
end
至于如何测试服务对象——这真的是一个几乎不可能涵盖的主题,因为服务对象实际上只是一种设计模式,它包括编写执行单个工作的简单对象并将所有需要的输入作为构造函数或方法论据。测试它们实际上与测试任何其他类型的对象没有什么不同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。