2012-05-09 2 views
2

Это мой тестMoq: Верификация защищенный метод на абстрактный класс называется

[TestClass] 
public class RepositoryTests 
{ 
    private APurchaseOrderRepository _repository; 

    [TestInitialize] 
    public void TestInitialize() 
    { 
     _repository = new FakePurchaseOrderRepository(); 
    } 

    [TestMethod] 
    public void RepositoryGetPurchaseOrdersForStoreCallsValidatePurchaseOrders() 
    { 
     var store = new Store(); 
     var mockRepo = new Mock<APurchaseOrderRepository>(); 
     mockRepo.Protected().Setup("ValidatePurchaseOrders", ItExpr.IsAny<List<PurchaseOrder>>()); 

     _repository.GetPurchaseOrders(store); 

     mockRepo.Protected().Verify("ValidatePurchaseOrders", Times.Once(), ItExpr.IsAny<List<PurchaseOrder>>()); 
    } 
} 

APurchaseOrderRepository и его интерфейс похож на этот

public interface IPurchaseOrderRepository 
{ 
    List<PurchaseOrder> GetPurchaseOrders(Store store); 
} 

public abstract class APurchaseOrderRepository : IPurchaseOrderRepository 
{ 
    public abstract List<PurchaseOrder> GetPurchaseOrders(Store store); 

    protected virtual bool ValidatePurchaseOrders(List<PurchaseOrder> purchaseOrders) 
    { 
     return true; 
    } 
} 

И мой Поддельный

public class FakePurchaseOrderRepository : APurchaseOrderRepository 
{ 
    public override List<PurchaseOrder> GetPurchaseOrders(Store store) 
    { 
     var purchaseOrders = new List<PurchaseOrder>(); 

     ValidatePurchaseOrders(purchaseOrders); 

     return purchaseOrders; 
    } 
} 

Однако, мой тест не выполнен:

метод испытания PreSwapTests.RepositoryTests.RepositoryGetPurchaseOrdersForStoreCallsValidatePurchaseOrders бросили исключение: Moq.MockException: Ожидаемое вызов на макете один раз, но был 0 раз: макет => mock.ValidatePurchaseOrders (It.IsAny())

Конфигурированные настройки: mock => mock.ValidatePurchaseOrders (It.IsAny()), Times.Never Нет выполненных вызовов.

Что я делаю неправильно?

Примечания:

  • Moq.4.0.10827

Update:

Я думаю, что эта линия mockRepo.Protected().Setup("ValidatePurchaseOrders");, потому что мне нужно, чтобы добавить параметры к нему в качестве второго аргумента , но я не могу понять это правильно.

Обновление 2: Произведено несколько изменений, теперь оно скомпилировано, но не учитывается правильно ... или что-то, сообщение об ошибке и код оба обновлены выше.

ответ

1

понял, что я делал все это неправильно, изменил свои объекты, чтобы работать с этим тестом

[TestMethod] 
    public void RepositoryGetPurchaseOrdersForStoreCallsValidatePurchaseOrders() 
    { 
     var store = new Store(); 

     var mockPurchaseOrderProvider = new Mock<IPurchaseOrderProvider>(); 
     var mockPurchaseOrderValidator = new Mock<IPurchaseOrderValidator>(); 
     var purchaseOrderRepository = new PurchaseOrderRepository(mockPurchaseOrderProvider.Object, mockPurchaseOrderValidator.Object); 

     mockPurchaseOrderValidator.Setup(x => x.ValidatePurchaseOrders(It.IsAny<List<PurchaseOrder>>())); 

     purchaseOrderRepository.GetPurchaseOrders(store); 

     mockPurchaseOrderValidator.Verify(x => x.ValidatePurchaseOrders(It.IsAny<List<PurchaseOrder>>()), Times.Once()); 
    } 

Это гораздо лучше, структура теперь я думаю.

0

Это потому, что ValidatePurchaseOrders не находится в вашем интерфейсе IPurchaseOrderRepository.

Репозиторий объявлен как private IPurchaseOrderRepository _repository;, поэтому он может видеть только, что находится в интерфейсе.

+0

Изменено на 'private APurchaseOrderRepository _repository;', такая же ошибка – CaffGeek

+0

Ах, это потому, что это защищенный член. Либо сделайте это общедоступным, либо этот вопрос может помочь: http://stackoverflow.com/questions/3883835/verify-that-a-base-protected-method-is-called-with-moq-3-1 –

+0

Я думаю, что это это строка mockRepo.Protected(). Setup («ValidatePurchaseOrders»); потому что мне нужно добавить в нее параметры как второй аргумент, но я не могу понять, что это правильно. – CaffGeek