如何与许多人分享变量"它" rspec中的例子

时间:2017-01-17 11:05:28

标签: ruby-on-rails rspec factory-bot

我正在使用let来创建使用工厂女孩的用户记录。但是我想在上下文中的2个测试中使用完全相同的变量,因为user_id和email对我发送的外部API很重要。

然而,我没有运气在单个示例中使用单个变量。这是我目前的代码

context "User" do
    let(:user) { FactoryGirl.create(:user) }

    it "should create user and return 'nil'" do
      expect(send_preferences(user, "new")).to eq nil
    end

    it "should not create user preferences again after sending two consecutive same requests" do
      expect(send_preferences(user, "new")).to eq "User preferences already saved. No need to re-save them."
    end

    it "should update user preferences" do
      expect(send_preferences(user, "update")).to eq nil
    end
  end

任何线索?

2 个答案:

答案 0 :(得分:2)

您可以在let中使用let:

context "User" do
  let(:email_address) { 'test@test.com' }
  let(:user) { FactoryGirl.create(:user, email_address: email_address) }

然后,您还可以访问所有测试中的email_address变量。

这是有效的,因为以前电子邮件地址是每次创建用户时由工厂随机生成的,因为我们没有在任何地方设置它的值。因此,我们在每个测试中调用了以下代码:

send_preferences(user, "new")

它呼叫用户'让我们创建一个具有完全随机的电子邮件地址的新用户(因为我们没有给它一个特定的电子邮件值)。因此,在后端API调用期间,它每次都发送一个不同的电子邮件地址。

let(:user) { FactoryGirl.create(:user) }

但是,当我们定义电子邮件地址时,请让我们as' test@test.com',并按照我提供的代码将其传递到用户工厂,我们用我们自己的静态值覆盖随机生成的电子邮件地址,因此,每次我们再次调用代码时:

send_preferences(user, "new") 

它现在触发了用户工厂创建,这也是我们新的' email_address' let,每次调用时始终设置为test@test.com的特定值。

let(:email_address) { 'test@test.com' }
let(:user) { FactoryGirl.create(:user, email_address: email_address) }

因此,当进行后端API调用时,电子邮件地址始终是我们设置的。

另外,如果我们愿意的话,我们可以在任何测试中使用该变量。例如:

it 'should set the email address' do
  expect(user.email_address).to eq(email_address)
end

用几句话很难解释,但如果仍然不清楚,请告诉我。

答案 1 :(得分:1)

在我看来,在多个测试之间共享实例化变量是90%的反模式。

执行以下操作的问题是您将在数据库中创建对象而不进行清理。

#include <iostream>
#include <fstream>

using namespace std;
const int arraySize = 5;

int main(int argc, char** argv)
{
    ifstream d;
    d.open("students.txt");
    ofstream b;
    b.open("succesful.txt");
    ofstream c;
    c.open("unsuccesful.txt");

    int aem;
    double a[arraySize];
    int min, max;
    double grades, average;
    grades = average = 0;
    min = max = 0;

    for (int i = 0; i < arraySize; i++)
    {
        d >> aem >> a[i];
        grades = grades + a[i];
        average = grades / arraySize;

        if (a[i] >= 5) b << aem << " " << a[i] << endl;
        else c << aem << " " << a[i] << endl;
    }

    for (int i = 0; i < arraySize; i++)
    {
        if (a[i] = max)
            max = a[i];
        break;
        if (a[i] = min)
            min = a[i];
        break;
    }


    cout << "The average is:" << average;
    cout << "Maximum is:" << max;
    cout << "Minimum is:" << min;
    d.close(); c.close(); b.close();
    system("pause");
    return 0;
}

当然,您可以执行before(:all) do @user = FactoryGirl.create :user end 阻止或使用DatabaseCleaner,但我认为测试尽可能独立是更好的做法。在您的情况下,在对第二次发生的事情进行预期之前,请设置before(:after)事件:

send_preferences