如何根据传递给它的对象类来存根和测试调用不同方法的助手



我有一个助手,我正试图在Minitest中为它编写测试。助手根据我作为参数传递的对象类调用另一个方法,如下所示:

def label_for(object)
status = object&.status
case object.class.name
when "Subscription"
class_for_subscription_status(status)
when "Payment"
class_for_payment_status(status)
when "Purchase"
class_for_purchase_status(status)
when "Invoice"
class_for_invoice_status(status)
when "Ticket"
class_for_ticket_status(status)
end

每个单独的方法都已经在其他地方进行了测试,所以我只需要测试一下,如果我将类Subscription对象传递给label_for,它将调用class_for_subscription_status(status),而不是其他东西。

这是我提出的测试,但我有NoMethodError: undefined method ``class_for_subscription_status' for #<AuxiliariesHelperTest错误。

test "#label_for(object) should invoke the right helper if object is of class Subscription" do
AuxiliariesHelperTest.any_instance.stubs(:label_for).with(subscriptions(:user)).returns(:class_for_subscription_status)
assert_equal class_for_subscription_status(subscriptions(:user).status), label_for(subscriptions(:user))
end

我做错了什么?

你能添加整个类吗?仅仅用这个片段就有点难以猜测。

我看到的一个问题是,您正在从AuxiliariesHelperTest类而不是AuxiliariesHelper类中存根一个方法。

另一个可能的问题是,您的助手似乎是一个模块,而不是一个类,您应该在测试文件中包含该助手。或者您的测试类应该继承自ActionView::TestCase。这样的东西可能会有所帮助:

class AuxiliariesHelperTest < ActionView::TestCase
include AuxiliariesHelper

test "#label_for(object) should invoke the right helper if object is of class Subscription" do
AuxiliariesHelper.any_instance.stubs(:label_for).with(subscriptions(:user)).returns(:class_for_subscription_status)
assert_equal class_for_subscription_status(subscriptions(:user).status), label_for(subscriptions(:user))
end
end

虽然在我看来,你不应该存根方法,但期望正确的方法被调用:

class AuxiliariesHelperTest < ActionView::TestCase
include AuxiliariesHelper

test "#label_for(object) should invoke the right helper if object is of class Subscription" do
AuxiliariesHelper.any_instance.expects(:label_for).with(subscriptions(:user).status)
label_for(subscriptions(:user))
end
end

最新更新