某些背景: 我试图测试一个方法是否在控制器的动作中被调用。我正在尝试记录用户注册的位置(移动,网络等)。
为控制器编写此规范而苦苦挣扎。我编写了这个测试,以确保调用控制器操作中的post_signup:
describe Api::Users::FacebookConnectController do
...
it "should log an event with an app_context" do
expect_any_instance_of(described_class).to receive(:post_signup)
subject
end
它快速而且很脏,甚至不检查方法#post_signup被调用的参数。
我的实际控制器有一个#register方法,在某些时候调用这个post_signup方法:
post_signup(user,
Event::EventType::USER_FB_ACCOUNT_NON_SUBSCRIPTION_COMPLETED,
app_context: current_app_id,
description: "Automatically Populated Via #{current_app_id}")
包含在控制器中的帮助器内的post_signup方法如下所示:
def post_signup(user, event_type, app_context: current_app_id, description: "Automatically populated")
...
Event.create!(
event_type: event_type,
date: Time.now.utc,
eventable: user,
description: description,
app_context: app_context
)
...
end
简而言之,对我来说这似乎是一件合理的事情。我想测试在控制器中调用#register动作时调用#post_signup
我的测试很糟糕我觉得因为我实际上并没有捕获实际的控制器。我正在测试控制器的任何实例都接收post_Signup方法,而我也没有指定参数。我怎么用模拟器做这个?如何测试所描述的类中的实际控制器而不仅仅是一些随机实例?如何检查是否使用名为app_context的参数调用post_signup?