我正在使用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
任何线索?
答案 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