rails世界的新手。使用4.2.4。
我正在尝试为我的应用创建一个模型并为其编写一些单元测试,但是在运行更改迁移后我遇到了困难。我用
创建了一个模型rails generate model player first_name:string last_name:string dispaly_name:string
并运行rake db:migrate RAILS_ENV=test
然后我写了一个(失败的)单元测试,以确保在调用save时设置了正确的字段。此时,我意识到我拼错了dispaly_name
,因此我创建了一个修改列名的更改迁移。
现在当我尝试运行单元测试rake test test/models/player_test.rb
时,我收到一条错误(UndefinedColumn
),说明保存失败,因为Player
模型仍在尝试使用{保存{1}}代替dispaly_name
。我运行了display_name
rake db:migrate
rake db:migrate RAILS_ENV=test
并运行了rake db:test:prepare
和rails c
,并通过运行RAILS_ENV=test rails c
检查了列名是否设置正确。我还检查了Player.column_names
。一切似乎都井然有序,但我无法弄清楚为什么我的测试用例中的schema.rb
使用旧的列名。
有人可以解释发生了什么吗?
答案 0 :(得分:2)
我明白了:
创建模型时,会创建一个夹具以及测试文件。
您使用字段名称dispaly_name
创建了模型,并在文件YourApp/test/fixtures/player_test.yml
中创建了字段dispaly_name
。对?。
但问题是,当您将字段名称更改为display_name
时,它会在MODEL
和TABLE
中更改,但不会在fixture文件中更改。所以你需要在灯具文件中纠正你的字段。
请更改档案dispaly_name
YourApp/test/fixtures/player_test.yml
我希望它能起作用:)。
答案 1 :(得分:0)
根据您用于填充测试数据库的内容, FactoryGirl , Fabrication 或默认的 Fixtures ,Rails应用程序会出现,在那里更改数据字段名称。然后错误就会消失。
如果错误仍然存在,请尝试重新启动服务器。我不这么认为,重新启动服务器会产生任何影响,但只是试一试。
答案 2 :(得分:0)
尝试运行class LoadDataFromServer extends AsyncTask<String, String, String>
{
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pDialog = new ProgressDialog(context);
pDialog.setMessage("Please wait...");
isLoading=true;
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected String doInBackground(String... args)
{
String response=null;
try
{
if (args.length >= 1) {
strStartCount = args[0];
strEndCount = args[1];
}
else
{
strStartCount = "0";
strEndCount = "1";
}
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpEntity httpEntity = null;
HttpResponse httpResponse = null;
String studioID=Globals.getStr_Studio_ID();
String modifiedUrl= studioOrderDetailseUrl.concat("/").concat(studioID).concat("/").concat("all").concat("/").concat(strStartCount).concat("/").concat(strEndCount);
HttpGet httpGet = new HttpGet(modifiedUrl);
httpResponse = httpClient.execute(httpGet);
httpEntity = httpResponse.getEntity();
response = EntityUtils.toString(httpEntity);
if(response!=null)
{
JSONObject jsonObj = new JSONObject(response);
jsArray_contacts=jsonObj.getJSONArray("GetStudioManDataResult");
for(int i=0;i<jsArray_contacts.length();i++)
{
JSONObject jsob = jsArray_contacts.getJSONObject(i);
String orderName=jsob.getString("CustomerName");
String orderID=jsob.getString("OrderId");
String orderAmount=jsob.getString("FinalAmount");
String mobileNumber=jsob.getString("MobileNo");
DecimalFormat df = new DecimalFormat("0.00");
double value = Double.parseDouble(orderAmount);
orderAmount="Rs."+df.format(value);
year = Calendar.getInstance().get(Calendar.YEAR)%100;
strYear=Integer.toString(year);
intOrderID=Integer.parseInt(orderID);
formatedOrderID = String.format("%04d", intOrderID);
orderID="OD".concat(strYear).concat(formatedOrderID);
strOrderName.add(orderName);
strOrderId.add(orderID);
strOrderAmount.add(orderAmount);
strMobileNumber.add(mobileNumber);
}
if( strOrderId.size()>=1){
for(int i=0;i<strOrderId.size();i++){
str_Order_Amount=strOrderAmount.get(i);
str_Oder_ID=strOrderId.get(i);
str_Customer_number=strMobileNumber.get(i);
str_Customer_Name=strOrderName.get(i);
Customers_Orders_Bean cob = new Customers_Orders_Bean(str_Oder_ID, str_Customer_number, str_Customer_Name, str_Order_Amount);
customerlist.add(cob);
}
}
}
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
}
catch(IOException e)
{
}
catch(NullPointerException e)
{
System.out.println("All_Order_Asyntask:NullPointer"+e.toString());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
System.out.println("Inside the ALL -Order-POST()");
// setCustList();
//list_Order.setAdapter(new CustomizeOrderListAdapter(context,strOrderId, strOrderName,strOrderAmount,strMobileNumber));
if(pDialog.isShowing())
{
pDialog.dismiss();
}
adapter.notifyDataSetChanged();
isLoading=false;
}
}
,这将从当前开发阶段重新创建测试数据库模式。