【问题标题】:How to mock CreateBatchWrite object in Xunit如何在 Xunit 中模拟 CreateBatchWrite 对象
【发布时间】:2021-01-09 11:43:47
【问题描述】:

我正在用 c# 编写单元测试,我需要使用 Moq 模拟 CreateBatchWrite 的响应,但无法实例化 BatchWrite 对象的对象。我正在这样做: _dbContext.Setup(m => m.CreateBatchWrite<type>(It.IsAny<DynamoDBOperationConfig>())) .Returns(Mock.Of<BatchWrite<type>>());

我目前正在尝试此操作,但出现错误: System.NotSupportedException: Parent does not have a default constructor. The default constructor must be explicitly defined. 谁能帮我解决这个问题?

【问题讨论】:

    标签: c# moq xunit aws-sdk-net


    【解决方案1】:

    由于 BatchWrite 没有默认构造函数,因此您必须将其包装在 可以控制的另一个类中,即具有默认构造函数的类...

    例如:

    public class BatchWriteWrapper<T>
    {
        private readonly BatchWrite<T> _batchWrite;
    
        public BatchWriteWrapper()
        { }
    
        public BatchWriteWrapper(BatchWrite<T> batchWrite)
        {
            _batchWrite = batchWrite;
        }
    
        public void MethodFromBatchWrite()
        {
            _batchWrite.MethodFromBatchWrite();
        }
        
        // etc.
    }
    

    在您的代码中,您现在可以使用 BatchWrite 实例实例化您的包装器类并在包装器实例上进行测试。

    你的_dbContext可以设置如下:

    _dbContext.Setup(m => m.CreateBatchWrite<type>(It.IsAny<DynamoDBOperationConfig>()))
    .Returns(Mock.Of<BatchWriteWrapper<type>>());
    

    在你的代码中,你包装你得到的任何BatchWrite 实例,并使用包装器代替:

    var batchWrite = new BatchWriteWrapper(_dbContext.CreateBatchWrite<type>(...));
    

    如果您想更进一步,您还可以包装 _dbContext 的类型,以便它返回包装的实例,而不是它自己的(不可模拟的)实例。

    【讨论】:

    • 你能举个例子解释一下吗?
    • 这无济于事,因为它是无法创建的 BatchWrite 对象。
    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2017-04-07
    • 2021-08-22
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    相关资源
    最近更新 更多