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 を使用してこれを確認し、テストをデバッグして、サービスのテスト データが入力された「結果」の値を調べました。

編集:

テスト コンストラクターを [TestInitialize] 関数に変更したので、テストは次のようになります。

[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));
    }
}
4

2 に答える 2

3

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

正しいものを含めないと、説明している動作が発生します(メソッドが適切にスタブされていません)。

于 2013-10-15T14:54:27.507 に答える
1

JustMockのマニュアルでは次のように説明されています (ハイライトは私によるものです)。

デフォルトでは、Telerik JustMock は緩いモックを使用し、特定の型で任意のメソッドを呼び出すことができます 。メソッド呼び出しが配置されているかどうかに関係なく、呼び出すことができます。

Create()Mockのメソッドを呼び出すときに、この動作を制御できます。

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

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

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

  • Loose : 明示的に設定しない限り、デフォルトでモック呼び出しがスタブのように動作することを指定します。
  • RecursiveLoose : 明示的に設定しない限り、デフォルトでモック呼び出しがモック オブジェクトを返すことを指定します。
  • Strict : 明示的に設定されていない場合、モックで行われたすべての呼び出しが例外をスローすることを指定します。
  • CallOriginal : 何らかの期待が設定されていない限り、既定では、モックに対して行われるすべての呼び出しが、対応する元のメンバーを呼び出すことを指定します。
于 2013-10-14T16:28:06.660 に答える