Les Tests unitaires sur le Contrôleur qui utilise AutoMapper
Je suis en train de test de l'unité d'un UpdateUser Contrôleur qui utilise mappant automatiquement. Voici le code pour le contrôleur
UpdateUserController
private readonly IUnitOfWork _unitOfWork;
private readonly IWebSecurity _webSecurity;
private readonly IOAuthWebSecurity _oAuthWebSecurity;
private readonly IMapper _mapper;
public AccountController()
{
_unitOfWork = new UnitOfWork();
_webSecurity = new WebSecurityWrapper();
_oAuthWebSecurity = new OAuthWebSecurityWrapper();
_mapper = new MapperWrapper();
}
public AccountController(IUnitOfWork unitOfWork, IWebSecurity webSecurity, IOAuthWebSecurity oAuthWebSecurity, IMapper mapper)
{
_unitOfWork = unitOfWork;
_webSecurity = webSecurity;
_oAuthWebSecurity = oAuthWebSecurity;
_mapper = mapper;
}
//
//Post: /Account/UpdateUser
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UpdateUser(UpdateUserModel model)
{
if (ModelState.IsValid)
{
//Attempt to register the user
try
{
var userToUpdate = _unitOfWork.UserRepository.GetByID(_webSecurity.CurrentUserId);
var mappedModel = _mapper.Map(model, userToUpdate);
**mappedModel will return null when run in test but fine otherwise (e.g. debug)**
_unitOfWork.UserRepository.Update(mappedModel);
_unitOfWork.Save();
return RedirectToAction("Index", "Home");
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
}
}
return View(model);
}
et c'est mon Test Unitaire
UpdateUserControllerTest
[Fact]
public void UserRepository_Update_User_Success()
{
Controller = new AccountController(UnitOfWork, WebSecurity.Object, OAuthWebSecurity.Object, Mapper);
const string emailAsUserName = "[email protected]";
const string password = "password";
const string email = "[email protected]";
const string emailNew = "[email protected]";
const string firstName = "first name";
const string firstNameNew = "new first name";
const string lastName = "last name";
const string lastNameNew = "new last name";
var updatedUser = new User
{
Email = emailNew,
FirstName = firstNameNew,
LastName = lastNameNew,
UserName = emailAsUserName
};
WebSecurity.Setup(
s =>
s.CreateUserAndAccount(emailAsUserName, password,
new { FirstName = firstName, LastName = lastName, Email = email }, false))
.Returns(emailAsUserName);
updatedUser.UserId = WebSecurity.Object.CurrentUserId;
UnitOfWork.UserRepository.Update(updatedUser);
UnitOfWork.Save();
var actualUser = UnitOfWork.UserRepository.GetByID(updatedUser.UserId);
Assert.Equal(updatedUser, actualUser);
var model = new UpdateUserModel
{
Email = emailAsUserName,
ConfirmEmail = emailAsUserName,
FirstName = firstName,
LastName = lastName
};
var result = Controller.UpdateUser(model) as RedirectToRouteResult;
Assert.NotNull(result);
}
J'ai une impression que lorsque vous exécutez en mode test, le mappeur de ne pas regarder le mappeur de configuration que j'ai mis dans le Global.asax. Depuis l'erreur se produit pendant l'exécution du test de l'unité, mais pas lors de l'exécution du site web est. J'ai créé un IMappaer interface comme un DI donc je peux le simuler des fins de test. J'ai utilisé Moq pour les Moqueries et les xUnit comme un framework de test, j'ai également installé AutoMoq que je n'ai pas encore utilisé. Une idée? Merci de regarder mon long post. J'espère que quelqu'un peut aider, été de me gratter la tête pendant des heures et lu beaucoup de messages.
OriginalL'auteur Steven | 2013-05-08
Vous devez vous connecter pour publier un commentaire.
Dans votre test, vous devez créer un moqué de la version de votre
IMapper
interface sinon vous n'êtes pas de tests unitaires, vous êtes des tests d'intégration. Ensuite, vous avez juste besoin de faire un simplemockMapper.Setup(m => m.Map(something, somethingElse)).Returns(anotherThing)
.Si vous souhaitez utiliser le réel AutoMapper mise en œuvre dans vos tests, alors vous devez le configurer en premier. Vos essais ne seront pas automatiquement chercher votre
Global.asax
, vous devrez configurer les mappages dans les tests. Quand je suis les tests d'intégration comme cela, j'ai normalement un statiqueAutoMapperConfiguration.Configure()
méthode que j'appelle dans un contexte de test d'installation. Pour NUnit c'est le[TestFixtureSetUp]
méthode, je pense que pour xUnit vous suffit de mettre dans le constructeur.Ayant AutoMapperConfiguration.Configurer () [TestFixtureSetUp] méthode, je pense que c'est la meilleure façon de le faire.
Pour moi, j'avais également spécifier l'assemblée pour l'utiliser comme mon auto-mappeur a son propre projet: AutoMapperConfiguration.ConfigureAutoMapper(typeof(someMappingConfig).Assemblée)
OriginalL'auteur Adam Rodger