2016-07-10 6 views
0

Ich schreibe eine UnitTest, die die FillInventory-Methode aufrufen, die in dieser Methode etwas in der Datenbank aktualisiert werden und in der Unit-Test möchte ich etwas überprüfen Daten vor und nach dem Aktualisieren in der DB durch Aufrufen der FillInventory-Methode und Überprüfen ihrer Eingaben.Mocking-Methode Abhängigkeit von Art von context.Database.ExecuteSqlCommand im Komponententest

In meinem Dienst:

public void FillInventory(InventoryViewModel invViewModel) 
{ 

    long roomServiceId = invViewModel.RoomServiceId; 
    var roomService = _unitOfWork.RoomServiceRepository.GetByID(roomServiceId); 
    var placeId = roomService.Room.PlaceId; 
    var capacity = roomService.Room.Capacity + roomService.ExtraCapacity; 

    for (DateTime date = invViewModel.StartDate; date.Date < invViewModel.EndDate; date = date.AddDays(1)) 
    { 
     var inv = _unitOfWork.InventoryRepository.GetByKey(invViewModel.RoomServiceId, date); 
     if (inv != null) 
     { 
      inv.Price =(invViewModel.isUpdatingPrice)? invViewModel.Price:inv.Price; 
      inv.BoardPrice = (invViewModel.isUpdatingBoardPrice) ? invViewModel.BoardPrice : inv.BoardPrice; 
      inv.CertainAvailability = (invViewModel.isUpdatingCertainAvailability) ? invViewModel.CertainAvailability : inv.CertainAvailability; 
      inv.FloatAvailability = (invViewModel.isUpdatingFloatAvailability) ? invViewModel.FloatAvailability : inv.FloatAvailability; 
      inv.setWebServices(invViewModel.SellableWebServices.Select(sw => sw.Key).ToList()); 
     } 
     else 
     { 
      var price = (invViewModel.isUpdatingPrice) ? invViewModel.Price : 0; 
      var boardPrice = (invViewModel.isUpdatingBoardPrice) ? invViewModel.BoardPrice : 0; 
      var certainAvailability = (invViewModel.isUpdatingCertainAvailability) ? invViewModel.CertainAvailability : 0; 
      var floatAvailability = (invViewModel.isUpdatingFloatAvailability) ? invViewModel.FloatAvailability : 0; 


      inv = new Jabama.Core.DataLayer.Models.Inventory(roomService, date, floatAvailability, certainAvailability, 
       price, boardPrice); 

      _unitOfWork.InventoryRepository.Insert(inv); 
     } 


    } 
    _unitOfWork.Save(); 
    _unitOfWork.PlaceInfoRepository.UpdatePlaceInfos(placeId, capacity, invViewModel.StartDate, invViewModel.EndDate); 
} 

In meinem Repository

public class PlaceInfoRepository : GenericRepository<PlaceInfo> 
{ 
    public PlaceInfoRepository(JabamaContext context):base(context) 
    { } 

    public void UpdatePlaceInfos(long placeId, int capacity, DateTime startDate, DateTime endDate) 
    { 
     var cmd = context.Database.Connection.CreateCommand(); 
     List<SqlParameter> p = new List<SqlParameter>(); 
     p.Add(new SqlParameter("@placeId", placeId)); 
     p.Add(new SqlParameter("@capacity",capacity)); 
     p.Add(new SqlParameter("@startDate", startDate.Date.ToString("yyyy -MM-dd"))); 
     p.Add(new SqlParameter("@endDate", endDate.Date.ToString("yyyy-MM-dd"))); 

     context.Database.ExecuteSqlCommand("exec UpdatePlaceInfo @placeId, @capacity, @startDate, @endDate", p.ToArray()); 
    } 
} 

Ich habe alles, was Unit-Test, aber jetzt zu verspotten benötigte verspottet gibt es ein Problem, wenn Repository will mit context.Database.ExecuteSqlCommand Daten aktualisieren.

Wie kann ich es verspotten?

Antwort

1

Keine Notwendigkeit, die DbContext und ihre Mitglieder zu verspotten/fälschen - Sie verspotten nur die PlaceInfoRepository.

Sie Ziel ist es, dass FillInventorycalls the UpdatePlaceInfos with proper arguments zu überprüfen - nicht mehr, nicht weniger:

// Arrange 
var repositoryMock = new SomeMock<IPlaceInfoRepository>(); 
... // Setup mock for verification. 
var service = new Service(repositoryMock.Object); 

// Act 
service.FillInventory(vm); 

// Assert 
repositoryMock.Verify(); 

Alles andere, und es wäre zu einem Modul Integrationstest näher sein, dass, während in vielen Fällen nützlich ist manchmal mehr schwer zu tun und hat normalerweise einen größeren Umfang als eine einzelne Code-Einheit.

Verwandte Lektüre - http://martinfowler.com/articles/mocksArentStubs.html

Verwandte Themen