2012-01-03 9 views
0

コントローラのリストアクションでユニットテストをしようとしています。ここではそれをテストするためのコードは次のとおりです。ユニットテストコントローラgrails

void testListAction() 
    { 
     ac = new AddressesController(); 

     def org = new Organizations(viewAllPost: true); 
     mockForConstraintsTests(Addresses); 
     def a = new Addresses(firstLine:'A', secondLine:'B', thirdLine:'C', luCountry:UnitedStates, zipCode:'12345', luState:Florida, city:'jag'); 
     assertTrue(a.validate()); 
     mockSession['currentUserOrganizationId'] = org; 

     mockDomain(Addresses, [ 
      new Addresses(firstLine:'A1', secondLine:'B', thirdLine:'C', luCountry:UnitedStates, zipCode:'12345', luState:Florida, city:'jag'), 
      new Addresses(firstLine:'A2', secondLine:'B2', thirdLine:'C2', luCountry:UnitedStates, zipCode:'12344', luState:Florida, city:'jag2') 
      ]); 

     def model = ac.list(); 
     assertEquals(2, model.postInstanceList.size()); 
    } 

しかし、私は、私はいつもmodel.postInstanceListがNULLであることと同じ結果が戻って取得していますし、私はそれにサイズのメソッドを呼び出すことはできませんしようとしたどんなに。私はここで間違って何をしていますか?

+1

いくつかのポインタ:あなたのインスタンスで、それは次のようになりますので、モデルのオフあなたが好きなアクセス次に

def model = controller.modelAndView.model 

:ユニットテストでは、経由でモデルにアクセスする必要がありますコントローラのインスタンスを作成します。あなたのテストクラスがAddressControllerTestsと呼ばれていると仮定すると、AddressControllerのインスタンスは既に 'controller'という変数で利用可能になっています。また、私はモデルのサイズをテストしないだろう、私は応答をテストするだろう; controller.response。???。コントローラーをテストすると、戻ってくる応答をテストする必要があります。 – Gregg

+0

これらは両方とも正しいポインタです。リストの実際の内容をテストする必要がありますが、リストのサイズが正しいかどうかだけをテストしています。これは簡単なテストでなければなりません。 –

答えて

1

インスタンスを保存していません。あなたは、保存してください:

mockDomain(Addresses) 
new Addresses(firstLine:'A1', secondLine:'B', thirdLine:'C', luCountry:UnitedStates, zipCode:'12345', luState:Florida, city:'jag').save() 

new Addresses(firstLine:'A2', secondLine:'B2', thirdLine:'C2', luCountry:UnitedStates, zipCode:'12344', luState:Florida, city:'jag2').save() 

を私はこのようにそれを行うだろう:

mockDomain(Addresses) 
mockForContraintsTests(Addresses) 
def address1 = new Addresses(firstLine:'A1', secondLine:'B', thirdLine:'C', luCountry:UnitedStates, zipCode:'12345', luState:Florida, city:'jag') 
if(address1.validate()) address1.save() 
def address2 = new Addresses(firstLine:'A2', secondLine:'B2', thirdLine:'C2', luCountry:UnitedStates, zipCode:'12344', luState:Florida, city:'jag2') 
if(address2.validate()) address2.save() 


assertEquals 2, Addresses.list().size() 
+0

それがうまく動作しないときに、次のようにしてエラーを出しています: groovy.lang.MissingMethodException:メソッドのシグネチャがありません:thlc.Addresses.save()は引数タイプに適用できます:()values:[ ]可能な解決策:wait()、any()、wait(long)、use([Ljava.lang.Object])、isCase(java.lang.Object)、each(groovy.lang.Closure) –

+0

これは: アドレスa1 =新しいthlc.Addresses(firstLine: 'A1'、secondLine: 'B'、thirdLine: 'C'、luCountry:UnitedStates、zipCode: '12345'、luState:フロリダ、city: 'jag') ; アドレスa2 =新しいthlc.Addresses(firstLine: 'A2'、secondLine: 'B2'、thirdLine: 'C2'、luCountry:UnitedStates、zipCode: '12344'、luState:フロリダ、city: 'jag2'); \t mockDomain(アドレス、[a1、a2]); a1.save(); a2.save(); しかし、これは動作していない、以前と同じ問題を与える。 –

+1

あなたは私の意見では悪い考えであるあなたのテストにロジックを追加しています。あなたの提案された解決策の問題は、オブジェクトがモックデータベースに追加される可能性があり、そうでないかもしれないということです。プロダクションコードが間違っている場合、または何らかの理由でオブジェクトが検証をパスしない場合、アサーションでテストが失敗します。このユニットテストでは、オブジェクトの有効性をテストするのではなく、コントローラメソッドをテストしています。有効なオブジェクトを確保したい場合は、.save(failOnError:true)を使用して、保存時には失敗し、アサートでは失敗します。私の2セント。 –

2

あなたは間違ってモデルにアクセスしています。あなたがする必要はありません -

ac.list() 
def model = ac.modelAndView.model 
assertEquals(2, model.postInstanceList.size())