2017-05-06 6 views
6

私は既存のMVC Webアプリケーションの単体テストを作成しようとしています。その中で私はオートマッパー(IMapper)のいくつかの問題に直面しています。マップ機能を使用しているときはいつでも、それはnullの値を返します。コントローラーでAutomapper(IMapper)をモックする方法

私のコントローラコード:

public class UserAdministrationController : BaseController 
{ 
    private readonly iUserService _userService; 
    private readonly IMapper _mapper; 

    public NewsController(iUserService userService, IMapper mapper) 
    { 
     _userService = userService; 
     _mapper = mapper; 
    } 

    public ActionResult Create(int CompanyID == 0) 
    {    
     UserDetail data = _userService(CompanyID); 
     var Modeldata = _mapper.Map<UserDetailViewModel, UserDetail>(data); 
     return View(Modeldata); 
    } 
} 

モックマッピングコード:

public class MappingDataTest : CommonTestData 
{ 
    public Mock<IMapper> MappingData() 
    { 
     var mappingService = new Mock<IMapper>(); 
     UserDetailViewModel interview = getUserDetailViewModel(); // get value of UserDetailViewModel 
     UserDetail im = getUserDetail(); // get value of UserDetails 

     mappingService.Setup(m => m.Map<UserDetail, UserDetailViewModel>(im)).Returns(interview); 
     mappingService.Setup(m => m.Map<UserDetailViewModel, UserDetail>(interview)).Returns(im); 

     return mappingService; 
    } 
} 

モッキングコード:

[TestClass] 
public class UserAdminControllerTest 
{ 
    private MappingDataTest _common; 

    [TestInitialize] 
    public void TestCommonData() 
    { 
     _common = new MappingDataTest(); 
    } 

    [TestMethod] 
    public void UserCreate() 
    { 
     //Arrange            
     UserAdministrationController controller = new UserAdministrationController(_common.mockUserService().Object, _common.MappingData().Object); 
     controller.ControllerContext = _common.GetUserIdentity(controller); 

     // Act 
     ViewResult newResult = controller.Create() as ViewResult; 

     // Assert 
     Assert.IsNotNull(newResult); 
    } 
} 

マッパーが、常にコントローラにnull値を示す機能していません。親切に私を助けてください。前もって感謝します。

+1

"なぜ私は必要なのですか?" Automapperは、マッピング設定が正しいことをアサートすることができます。おそらくあなたのユーザーサービスはテストされています。したがって、コントローラをテストする必要はありません。 – Mardoxx

+0

ああいいです。これは、彼らがコントローラの単体テストを行うよう依頼する私のクライアント要件です。 httppostにいくつかの追加機能があるかもしれないので、私は親切にこれを手伝ってやる必要があります。 – Dinesh

答えて

1

あなたは次のことを試してみてください:

public class MappingDataTest : CommonTestData 
{ 
    public Mock<IMapper> MappingData() 
    { 
     var mappingService = new Mock<IMapper>(); 

     UserDetail im = getUserDetail(); // get value of UserDetails 

     mappingService.Setup(m => m.Map<UserDetail, UserDetailViewModel>(It.IsAny<UserDetail>())).Returns(interview); // mapping data 
     mappingService.Setup(m => m.Map<UserDetailViewModel, UserDetail>(It.IsAny<UserDetailtViewModel>())).Returns(im); // mapping data 

     return mappingService; 
    } 
} 

事は、あなたのモックが)UserDetailViewModelインタビュー= getUserDetailViewModel(の正確なインスタンスを期待していましたさ。このマッピングを設定するために、これがnullを返す理由です。それはUserDetailViewModelへの参照を期待しており、UserDetailtViewModelへの参照に対しては、期待されるマッピングされたインスタンスを返します。

+0

「エラーが発生しました」「方法グループから「UserDetail」に変換できません」 – Dinesh

4

AutoMapperを非表示にすることをおすすめします。コントローラー単体テストの価値はそれほど高くありません。これはJSONシリアライザをモックするのと同じです。本当のことだけを使ってください。

+1

OPがあなたに耳を傾けるように感じます。あなたはその科目について何らかの知識を持っているかもしれません。 :-) –

+0

コントローラーの具体的な実装を使用すると、私は多くのことを気にしますが、私はあなたに同意します。 – Esen

関連する問題