2011-03-16 142 views
9

Facebook的整合,我想用黄瓜水豚通过执行以下情形来测试我的Rails应用程序的Facebook注册程序:测试Web应用程序与黄瓜

@javascript 
Scenario: Connect account 
    When I go to the home page 
    And I press "Connect your Facebook account" 
    And I fill in "[email protected]" for "Email" 
    And I fill in "test" for "Password" 
    And I press "Login" 
    And I press "Allow" 
    Then I should be on the dashboard page 

如何乡亲接近集成测试的问题基于浏览器的Facebook集成?网络搜索仅出现了几个博客帖子,它们早于图形API,他们似乎只讨论实现一个前提条件,该前提条件设置了一个表示已登录到Facebook的用户的环境。

一些具体问题需要解决:

一个人如何模拟点击<fb:login-button>元素?我提出的最好的事情(但还没有测试)是手动触发元素上的点击事件。

一旦Facebook对话框出现,水豚有权访问它吗?怎么样?这似乎是为了输入测试Facebook帐户的电子邮件地址和密码以及为测试帐户安装Facebook应用程序所必需的。

对于这个问题,如何管理测试账户? http://developers.facebook.com/docs/test_users/表示可以使用Graph API创建和删除测试用户,但API不希望为测试帐户提供对电子邮件地址或密码的访问权限,这似乎使测试用户无法测试此特定流程。

我确定我忽视了其他重要问题。我确信好奇其他人如何攻击这个问题!

+0

你有没有这方面的运气? – 2011-04-24 13:42:29

+0

我从来没有进一步了解原始方法,但嘲笑外部服务可能是最好的方法(请参阅下面的答案中的OmniAuth参考)。 – 2011-05-01 15:45:02

回答

2

我已经成功地得到rspec的acceptan这个工作CE规格与下面的代码:

https://gist.github.com/1084767

这使用mogli创建和销毁测试用户和水豚编排浏览器测试。我相信你可以通过删除shared_context块和使用Cucumber之前/之后挂钩来使它与Cucumber一起工作,例如:

Before '@fb_test_user' do 
    @fb_user = create_test_user(installed: false) 
end 

After '@fb_test_user' do 
    @fb_user.destroy 
end 

World(FacebookIntegrationHelpers) 
+0

AppConfig.facebook.access_token来自哪里? – Chamnap 2012-09-30 06:54:25

+0

这是一个应用程序特定的配置机制。它只是返回当您在其网站上设置应用程序时Facebook提供的访问令牌。 – tvachon 2012-10-10 19:20:41

13

我目前使用omniauth gem来处理这种类型的身份验证。 FBML已被弃用,所以我建议转移到JS SDK进行客户端FB交互。不管怎么说,如果你使用omniauth,可以相对容易地在您的ENV文件夹指定一些标签前,像这样踩灭了响应:

配置成功案例:

Before('@omniauth_test_success') do 
    OmniAuth.config.test_mode = true 

    OmniAuth.config.mock_auth[:facebook] = { 
    "provider" => "facebook", 
    "uid"  => '12345', 
    "user_info" => { 
     "email" => "[email protected]", 
     "first_name" => "John", 
     "last_name" => "Doe", 
     "name"  => "John Doe" 
     # any other attributes you want to stub out for testing 
    } 
    } 
end 

配置故障案例

Before('@omniauth_test_failure') do 
    OmniAuth.config.test_mode = true 
    [:default, :facebook, :twitter].each do |service| 
    OmniAuth.config.mock_auth[service] = :invalid_credentials 
    # or whatever status code you want to stub 
    end 
end 

Cukes特点

Scenario: A user unsuccessfully signs in with their email/password 
    Given I am on the homepage 
    When I follow "Login" 
    And I "unsuccessfully" sign in with email and pass 
    Then I should see "Failed." 

@omniauth_test_success 
    Scenario: A user successfully signs in with Facebook 
    Given I am on the homepage 
    And I follow "Login" 
    When I follow "facebook" 
    Then I should see "Login successful." 

@omniauth_test_failure 
    Scenario: A user unsuccessfully signs in with Facebook 
    Given I am on the homepage 
    And I follow "Login" 
    When I follow "facebook" 
    Then I should see "Failed." 
+0

关于JS SDK的好处。我一直有意看看OmniAuth。也就是说,你在成功和失败情况下究竟测试了什么?您是否正在验证一些正在执行的应用程序代码是否是由于追踪facebook步骤的结果?否则,你似乎没有测试OmniAuth的模拟服务实现以外的其他任何东西;)当我深入该库时,或许这个问题的答案将变得清晰。 – 2011-05-01 15:38:21

+0

你能说哪里(哪些文件)包含前两段代码?我知道第三个在一个.feature文件中。 – mharris7190 2014-04-08 03:20:29