3

MVC 4でWebサイトを構築し、Automapperを使用してドメインオブジェクトからViewmodelオブジェクトにマップしています。ここに記載されているように、Automapperを注入しましたhttp://rical.blogspot.in/2012/06/mocking-automapper-in-unit-testing.html

デバッグ中はアクションメソッド内で正常に機能していますが、ユニットテスト中にautomapperサービスを挿入すると、service.mapがnullを返していることがわかります。ただし、デバッグ中はマッピングは問題ありません。私は理由を見つけることができず、4時間以上試しています。Interviewというドメインクラスとそれに対応するViewmodelがInterviewModelとしてあります。マッピングをCreateMap();として初期化しました。automapper profile configで、グローバルスタートアップメソッドから呼び出されました。以下はコントローラーとアクションです...

public class NewsAndViewsController : Controller
{
    private IInterviewRepository repository;
    private IMappingService mappingService;

    public NewsAndViewsController(IInterviewRepository productRepository, IMappingService autoMapperMappingService)
    {
        repository = productRepository;
        mappingService = autoMapperMappingService;
    }

    [HttpPost, ValidateAntiForgeryToken]
    [UserId]
    public ActionResult Edit(InterviewModel interView, string userId)
    {
        if (ModelState.IsValid)
        {
            var interView1 = mappingService.Map<InterviewModel, Interview>(interView);
            **// THE ABOVE LINE RETURNING NULL WHILE RUNNING THE BELOW TEST, BUT NOT DURING DEBUGGING**
            repository.SaveInterview(interView1);
            TempData["message"] = string.Format("{0} has been saved", interView.Interviewee);
            return RedirectToAction("Create");
        }
        return View(interView);
    }
}

[TestMethod]
public void AddInterview()
{
    // Arrange
    var interviewRepository = new Mock<IInterviewRepository>();
    var mappingService = new Mock<IMappingService>();
    var im = new InterviewModel { Interviewee="sanjay", Interviewer="sanjay", Content="abc" };
    mappingService.Setup(m => m.Map<Interview, InterviewModel>(It.IsAny<Interview>())).Returns(im);
    var controller = new NewsAndViewsController(interviewRepository.Object, mappingService.Object);

    // Act
    var result = controller.Edit(im, "2") as ViewResult;

    // Assert - check the method result type
    Assert.IsNotInstanceOfType(result, typeof(ViewResult));
}
4

1 に答える 1

2

テストでは、mappingService.Setup()呼び出しでInterviewクラスとInterviewModelクラスを交差させました(余談ですが、オブジェクトを明確に保つために、より適切な命名規則を使用するか、varを使用しないでください-" im」、「interview」、「interview1」では、モデルとビューオブジェクトのどちらであるかを簡単に追跡できません。

これを試して:

[TestMethod]
public void AddInterview()
{
    // Arrange
    var interviewRepository = new Mock<IInterviewRepository>();
    var mappingService = new Mock<IMappingService>();
    var interview = new Interview();
    var im = new InterviewModel { Interviewee="sanjay", Interviewer="sanjay", Content="abc" };
    mappingService.Setup(m => m.Map<InterviewModel, Interview>(im).Returns(interview);
    var controller = new NewsAndViewsController(interviewRepository.Object, mappingService.Object);

    // Act
    var result = controller.Edit(im, "2") as ViewResult;

    // Assert - check the method result type
    Assert.IsNotInstanceOfType(result, typeof(ViewResult));
}
于 2012-11-21T15:20:48.300 に答える