这是我的测试
[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 =&gt; mock.ValidatePurchaseOrders(It.IsAny())
已配置的设置:mock =&gt; mock.ValidatePurchaseOrders(It.IsAny()),Times.Never No 调用。
我做错了什么?
注意:
更新
我认为这是mockRepo.Protected().Setup("ValidatePurchaseOrders");
这一行,因为我需要将参数作为第二个参数添加到它,但我似乎无法将其正确。
更新2: 做了一些修改,现在它编译,但没有正确计数......或者其他什么,错误信息和代码都在上面更新。
答案 0 :(得分: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());
}
现在我认为这是一个更好的结构。
答案 1 :(得分:0)
这是因为ValidatePurchaseOrders
界面中没有IPurchaseOrderRepository
。
存储库被声明为private IPurchaseOrderRepository _repository;
,因此它只能看到界面中的内容。