2013-10-14 7 views
5

私はMVC4アプリケーションのテストを書いています。コントローラの動作をテストしています。タイトルで言及したように、テストはテストデータを返す代わりにサービス(WCF)にヒットします。私は、このコントローラがあります。モックされたオブジェクトまだサービスを呼び出す

public class FormController : Controller 
{ 
    public SurveyServiceClient Service { get; set; } 
    public SurveyDao Dao { get; set; } 

    public FormController(SurveyServiceClient service = null, SurveyDao dao = null) 
    { 
     this.Service = service ?? new SurveyServiceClient(); 
     this.Dao = dao ?? new SurveyDao(Service); 
    } 

    // 
    // GET: /Form/ 

    public ActionResult Index() 
    { 
     var formsList = new List<FormDataTransformContainer>(); 
     Dao.GetForms().ForEach(form => formsList.Add(form.ToContainer())); 

     var model = new IndexViewModel(){forms = formsList}; 
     return View("Index", model); 
    } 

をそして、それは、このDAOオブジェクト使用しています:

public class SurveyDao 
{ 
    private readonly SurveyServiceClient _service; 
    private readonly string _authKey; 

    public SurveyDao(SurveyServiceClient serviceClient) 
    { 
     _service = serviceClient; 
    } 

    .... 

    public FormContract[] GetForms() 
    { 
     var forms = _service.RetrieveAllForms(); 
     return forms; 
    } 

をそして、これはJustMock、GetFormsのモック()ヘルパークラスにいくつかのテストデータを返す使用して私のテストで:

[TestClass] 
public class FormControllerTest 
{ 
    private SurveyDao mockDao; 
    private SurveyServiceClient mockClient; 

    public FormControllerTest() 
    { 
     mockClient = Mock.Create<SurveyServiceClient>(); 
     mockDao = Mock.Create<SurveyDao>(mockClient); 
    } 

    [TestMethod] 
    public void TestIndexAction() 
    { 
     //Arrange 
     var controller = new FormController(mockClient, mockDao); 
     Mock.Arrange(() => mockDao.GetForms()).Returns(TestHelpers.FormContractArrayHelper); 

     //Act 
     var result = controller.Index() as ViewResult; 

     //Assert 
     Assert.IsInstanceOfType(result.Model, typeof(IndexViewModel)); 
    } 
} 

私の問題は、テストを実行すると、サービスがまだ呼び出されていることです。私はこれをFiddlerを使って検証し、テストをデバッグし、サービスのテストデータが入った "result"の値を調べました。

EDIT:試験は次のようになりますので、私は、[TestInitialize]機能するテストのコンストラクタを変更した

JustMock manualは説明

[TestClass] 
public class FormControllerTest 
{ 
    private SurveyDao mockDao; 
    private SurveyServiceClient mockClient; 

    [TestInitialize] 
    public void Initialize() 
    { 
     mockClient = Mock.Create<SurveyServiceClient>(); 
     mockDao = Mock.Create<SurveyDao>(Behavior.Strict); 
    } 

    [TestMethod] 
    public void TestIndexAction() 
    { 
     //Arrange 
     var controller = new FormController(mockClient, mockDao); 
     Mock.Arrange(() => mockDao.GetForms()).Returns(TestHelpers.FormContractArrayHelper); 

     //Act 
     var result = controller.Index() as ViewResult; 

     //Assert 
     Assert.IsInstanceOfType(result.Model, typeof(IndexViewModel)); 
    } 
} 
+1

GetFormsを仮想メソッドにしないでください。 – rla4

+0

@ rla4、なぜそれを言うのですか?模倣されたメソッドは仮想である必要がありますか? – mam8cc

+1

です。私はJustMockに慣れていませんが、多くの模擬フレームワークはdynamixプロキシに依存しています。これは仮想メソッドを必要とする可能性があります:) – rla4

答えて

3

JustMockに適切なアセンブリを使用していることを確認してください。いくつかのものがあります(VisualBasic、Silverlight、JustMock)。JustMockはあなたのプロジェクトに含めるべきものです。

正しいものを含めることで、記述している動作が正しく行われません(正しくスタブされていません)。

1

(私がハイライト) :デフォルトTelerik JustMockことで

緩いモックを使用して、あなたはを呼び出すことができます任意のタイプの任意のメソッド のメソッド呼び出しがアレンジされているかどうかにかかわらず、呼び出すことができます。モックあなたのCreate()メソッドを呼び出すときに

あなたはこの動作を制御することができますがあり

var foo = Mock.Create<IFoo>(Behavior.Strict); 

はあなたが明示的に特定のメソッドを実装していない場合は、モックオブジェクトが何をすべきかを指定することができます。あなたの場合(私はそれがデフォルトの動作だと思う)、モックは実際にあなたが模擬したいオブジェクトの元のメソッドを呼び出します。

あなたはBehavior Enumeration列挙内に次の選択肢があります。

  • ルース:明示的に設定しない限り、デフォルトではモックの呼び出しは、スタブのように振る舞うことを指定します。
  • RecursiveLoose:明示的に設定しない限り、デフォルトで模擬呼び出しが模擬オブジェクトを返すことを指定します。
  • Strict:模擬に明示的に設定されていない場合、モックで行われた呼び出しが例外をスローすることを指定します。
  • CallOriginal:デフォルトでは、いくつかのエクスクエストが設定されていない限り、モックで行われたすべての呼び出しで、対応する元のメンバーが呼び出されることを指定します。
+0

私はモックを厳格な動作に変更し、サービスは依然として呼び出されています。 'mockDao = Mock.Create (Behavior.Strict); ' – mam8cc

+1

@ mam8cc:[[TestInitialize()]'](http://msdn.microsoft.com/en-us/library/microsoft)を追加してみてください。 .visualstudio.testtools.unittesting.testinitializeattribute.aspx)メソッドを呼び出して、 'FormControllerTest()'コンストラクタの代わりに 'mockClient'と' mockDao'のインスタンスをそのインスタンスに移動します。違いがありますか? –

+0

悲しいことに、それはありません。同じ結果。ちょっとした情報として、私はSurveyDaoが模擬に設定されていることをデバッグを通して確認しました。 – mam8cc

関連する問題