0

これが私のコントローラーです

    [POST("signup")]
    public virtual ActionResult Signup(UserRegisterViewModel user)
    {
        if (ModelState.IsValid)
        {
            var newUser = Mapper.Map<UserRegisterViewModel, User>(user);
            var confirmation = _userService.AddUser(newUser);

            if (confirmation.WasSuccessful)
                return RedirectToAction(MVC.Home.Index());
            else
                ModelState.AddModelError("Email", confirmation.Message);

        }
        return View(user);
    }

これが私のユニットテストです:

    [Test]
    public void Signup_Action_When_The_User_Model_Is_Valid_Returns_RedirectToRouteResult()
    {
        // Arrange
        const string expectedRouteName = "~/Views/Home/Index.cshtml";

        var registeredUser = new UserRegisterViewModel { Email = "newuser@test.com", Password = "123456789".Hash()};
        var confirmation = new ActionConfirmation<User>
                               {
                                   WasSuccessful = true,
                                   Message = "",
                                   Value = new User()
                               };
        _userService.Setup(r => r.AddUser(new User())).Returns(confirmation);

        _accountController = new AccountController(_userService.Object);

        // Act
        var result = _accountController.Signup(registeredUser) as RedirectToRouteResult;


        // Assert

        Assert.IsNotNull(result, "Should have returned a RedirectToRouteResult");
        Assert.AreEqual(expectedRouteName, result.RouteName, "Route name should be {0}", expectedRouteName);
    }

ユニットテストはここで失敗しました。

        var result = _accountController.Signup(registeredUser) as RedirectToRouteResult;

単体テストをデバッグすると、次のエラーメッセージが表示されました:「タイプマップ構成が欠落しているか、マッピングがサポートされていません。」

これは、構成が単体テストプロジェクトではなく、Webプロジェクトにあるためだと思います。それを修正するにはどうすればよいですか?

4

3 に答える 3

3

マッパーを構成する必要があるため、テストごとのセットアップではなく、テストクラスのセットアップで、コードを呼び出してマッピングをセットアップします。引数が一致しない、つまり異なるオブジェクトであるため、おそらくユーザー サービス呼び出しに対する期待を変更する必要があることに注意してください。おそらく、オブジェクトのプロパティがメソッドに渡されるモデルのプロパティと一致するかどうかを確認するテストが必要になるでしょう。

于 2012-07-19T02:30:13.883 に答える
2

AutoMapper を使用するのではなく、モックできるように、マッピング エンジンのインターフェイスを実際に使用する必要があります。それ以外の場合は、単体テストではなく統合テストになります。

AutoMapper には、IMappingEngine以下のように IoC コンテナーを使用してコントローラーに挿入できるというインターフェイスがあります (この例では StructureMap を使用しています)。

class MyRegistry : Registry
{
    public MyRegistry()
    {
        For<IMyRepository>().Use<MyRepository>();
        For<ILogger>().Use<Logger>();

        Mapper.AddProfile(new AutoMapperProfile());
        For<IMappingEngine>().Use(() => Mapper.Engine);
    }
}

次に、依存性注入を使用して AutoMapper のマッピング エンジンをコントローラーに注入し、以下のようにマッピングを参照できるようにします。

[POST("signup")]
public virtual ActionResult Signup(UserRegisterViewModel user)
{
    if (ModelState.IsValid)
    {
        var newUser = this.mappingEngine.Map<UserRegisterViewModel, User>(user);
        var confirmation = _userService.AddUser(newUser);

        if (confirmation.WasSuccessful)
            return RedirectToAction(MVC.Home.Index());
        else
            ModelState.AddModelError("Email", confirmation.Message);

    }
    return View(user);
}

詳細については、こちらを参照してください: How to inject AutoMapper IMappingEngine with StructureMap

于 2012-07-19T06:07:36.910 に答える
0

おそらく、マッピングを MappingEngine に抽象化するのはクールです。

時々、IOC Automapper に次のアプローチを使用します

IOC ビルダーで:

  builder.RegisterInstance(AutoMapperConfiguration.GetAutoMapper()).As<IMapper>();

GetAutoMapper は次のとおりです。

 public class AutoMapperConfiguration
    {
        public static IMapper GetAutoMapper()
        {
            var config = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile<OrderModelMapperProfile>();
                cfg.AddProfile<OtherModelMapperProfile>();
                //etc;
               });
            var mapper = config.CreateMapper();
            return mapper;
        }
    }

そして最後に Controller ctor で

 public MyController(IMapper mapper)
        {
            _mapper = mapper;
        }
于 2017-09-01T16:17:24.600 に答える