C# 4.0 Moq:正在验证调用抽象类上的受保护方法
这是我的测试C# 4.0 Moq:正在验证调用抽象类上的受保护方法,c#-4.0,methods,tdd,moq,verify,C# 4.0,Methods,Tdd,Moq,Verify,这是我的测试 [TestClass] public class RepositoryTests { private APurchaseOrderRepository _repository; [TestInitialize] public void TestInitialize() { _repository = new FakePurchaseOrderRepository(); } [TestMethod] publ
[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>>());
}
}
[TestClass]
公共类存储测试
{
私人采购或存储库;
[测试初始化]
public void TestInitialize()
{
_repository=新建FakePurchaseOrderRepository();
}
[测试方法]
public void RepositoryGetPurchaseOrdersForStoreCallsValidatePurchaseOrders()
{
var store=newstore();
var mockRepo=new Mock();
mockRepo.Protected().Setup(“ValidatePurchaseOrders”,ItExpr.IsAny());
_获取采购订单(存储);
mockRepo.Protected().Verify(“ValidatePurchaseOrders”、Times.Once()、ItExpr.IsAny());
}
}
一个PurchaseOrderRepository,它的界面如下所示
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;
}
}
公共接口IPurchaseOrderRepository
{
列出GetPurchaseOrders(商店);
}
公共抽象类APurchaseOrderRepository:IPurchaseOrderRepository
{
公共摘要列表GetPurchaseOrders(商店);
受保护的虚拟bool验证采购订单(列出采购订单)
{
返回true;
}
}
还有我的假货
public class FakePurchaseOrderRepository : APurchaseOrderRepository
{
public override List<PurchaseOrder> GetPurchaseOrders(Store store)
{
var purchaseOrders = new List<PurchaseOrder>();
ValidatePurchaseOrders(purchaseOrders);
return purchaseOrders;
}
}
公共类FakePurchaseOrderRepository:APurchaseOrderRepository
{
公共覆盖列表GetPurchaseOrders(商店)
{
var purchaseOrders=新列表();
验证采购订单(采购订单);
退货订单;
}
}
但是,我的测试失败,原因是:
试验方法
PreSwapTests.RepositoryTests.RepositoryGetPurchaseOrdersForStoreCallsValidatePurchaseOrders
引发异常:Moq.MockException:预期对模拟进行调用
一次,但为0次:mock=>
mock.ValidatePurchaseOrders(It.IsAny())
配置的设置:模拟=>
mock.ValidatePurchaseOrders(It.IsAny()),Times.Never否
执行的调用
我做错了什么
注:
- 最小起订量4.0.10827
mockRepo.Protected().Setup(“ValidatePurchaseOrders”)代码>,因为我需要将参数作为第二个参数添加到其中,但我似乎无法获得正确的结果
更新2:
做了一些修改,现在它可以编译了,但没有正确计数……或者,上面的错误消息和代码都被更新了。这是因为ValidatePurchaseOrders
不在您的ippurchaseorderpository
界面中
该存储库被声明为私有iPourchaseOrderRepository\u存储库代码>因此它只能看到界面中的内容。意识到我做的都是错的,因此更改了我的对象以进行此测试
[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());
}
[TestMethod]
public void RepositoryGetPurchaseOrdersForStoreCallsValidatePurchaseOrders()
{
var store=newstore();
var mockPurchaseOrderProvider=new Mock();
var mockPurchaseOrderValidator=new Mock();
var purchaseOrderRepository=新的purchaseOrderRepository(mockPurchaseOrderProvider.Object,mockPurchaseOrderValidator.Object);
mockPurchaseOrderValidator.Setup(x=>x.ValidatePurchaseOrders(It.IsAny());
获取采购订单(存储);
验证(x=>x.ValidatePurchaseOrders(It.IsAny()),Times.Once());
}
我认为现在这是一个更好的结构。改为私有apurchaseorderepository\u存储库代码>,同样的错误啊,这是因为它是受保护的成员。要么将其公开,要么这个问题可能会有所帮助:我认为这是一行mockRepo.Protected().Setup(“ValidatePurchaseOrders”);,因为我需要将参数作为第二个参数添加到它,但我似乎无法获得正确的参数。这是可能的,请参阅: