Je travaille actuellement avec Moq pour faire des tests unitaires. Je rencontre un problème où je spécifie ce que mon objet raillé renvoie, mais l'appel réel renvoie null au lieu de ce que je spécifie dans .Returns(...)
. J'ai examiné d'autres postes et une des suggestions était de créer la maquette avec MockBehavior.Strict
- après avoir fait cela, je reçois une erreur assez bavard comme suit:Objet MOQ retournant null en dépit de la spécification. Retourne
IMyRepository.Save(MvcIndividualAuth.Data.Models.DTO.MyTableDTO) invocation failed with mock behavior Strict. All invocations on the mock must have a corresponding setup.
Cependant, je fais appel à la seule configuration méthode que mon objet moqué appelle déjà. S'il vous plaît voir le code ci-dessous:
Mon test:
MyService _myService;
Mock<IMyRepository> _myRepoMock;
[TestInitialize]
public void Setup()
{
_myRepoMock = new Mock<IMyRepository>();
_myService = new MyService(_myRepoMock.Object);
}
[TestMethod]
public void MyServiceSave()
{
//Arrange
var myDto = new MyTableDTO { Id = 1, Bar = 5, Foo = "Test" };
_myRepoMock.Setup(x => x.Save(myDto)).Returns(myDto);
//Act
var vm = _myService.Save(new MyTableViewModel(myDto));
//Assert
Assert.AreEqual(vm.Id, 1);
Assert.AreEqual(vm.Foo, "Test");
Assert.AreEqual(vm.Bar, 5);
Assert.AreEqual(vm.BarPlusFoo, "5 Test");
}
méthode MyService.Save:
public MyTableViewModel Save(MyTableViewModel viewModel)
{
var dto = MyTableViewModel.GetDto(viewModel);
var dbDto = _myRepo.Save(dto); //_myRepo is of type IMyRepository,
// this _myRepo.Save call is returning null
var vm = new MyTableViewModel(dbDto);
return vm;
}
Pourquoi le repo moqué dans mon test ne pas retourner la valeur que je précise dans mon .Returns(..)
appel? Toute aide est appréciée.
EDIT: sur demande, voici la méthode MyRepository.Save et MyTableViewModel.GetDto():
MyRepository.Save:
public MyTableDTO Save(MyTableDTO dto)
{
try
{
var entity = new MyTable();
if (String.IsNullOrEmpty(dto.Foo))
{
throw new ArgumentException("MyTable requires Foo");
}
if (dto.Id == 0)
{
//added
entity.Update(dto);
_db.MyTables.Add(entity);
}
else
{
//modified
entity = _db.MyTables.Single(x => x.Id == dto.Id);
entity.Update(dto);
}
_db.SaveChanges();
return new MyTableDTO(entity);
}
catch (Exception)
{
throw;
}
}
MyTableViewModel.GetDto (..);
public static MyTableDTO GetDto(MyTableViewModel vm)
{
var dto = new MyTableDTO
{
Bar = vm.Bar,
Foo = vm.Foo,
Id = vm.Id
};
return dto;
}
Pourriez-vous montrer la méthode 'Repository.Save()' ? –
Veuillez inclure le code source de 'GetDto'. – mjwills
@RomaDoskoch mis à jour pour afficher la demande – GregH