Rails TestCase UndefinedColumn

时间:2015-12-08 04:49:46

标签: ruby-on-rails testcase

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:preparerails c,并通过运行RAILS_ENV=test rails c检查了列名是否设置正确。我还检查了Player.column_names。一切似乎都井然有序,但我无法弄清楚为什么我的测试用例中的schema.rb使用旧的列名。

有人可以解释发生了什么吗?

3 个答案:

答案 0 :(得分:2)

我明白了:

  

创建模型时,会创建一个夹具以及测试文件。

您使用字段名称dispaly_name创建了模型,并在文件YourApp/test/fixtures/player_test.yml中创建了字段dispaly_name。对?。

但问题是,当您将字段名称更改为display_name时,它会在MODELTABLE中更改,但不会在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; } } ,这将从当前开发阶段重新创建测试数据库模式。