Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 Moq:正在验证调用抽象类上的受保护方法_C# 4.0_Methods_Tdd_Moq_Verify - Fatal编程技术网

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”);,因为我需要将参数作为第二个参数添加到它,但我似乎无法获得正确的参数。这是可能的,请参阅: