c# - Moq - 不能模拟类属性的方法返回值

标签 c# moq

如何模拟 CasOperations.GetImpairedNodesFromCASpectrumAsync() 方法,以便它返回模拟值?目前,我遇到异常(显示在代码示例下方)。

我有以下设置:

要模拟的类和属性:

public class BranchCircuitStatusScheduleEntry : NWatchCustomScheduleEntryBase, INWatchCustomScheduleEntry
{
    public BranchCircuitStatusScheduleEntry(INWatchSchedulerApplication application)
        : base(application, DevOpsScheduleFrequency.Minute, 15, 0, DevOpsScheduleFlags.Always)
    {
        // Some initialization for below properties
        CasOperations = new CasOperations(cas, EntityService, IsBranchesOnly);
    }

    public CasOperations CasOperations { get; private set; }

}

public class CasOperations
{
    public CasOperations(CasApi casApi, BranchCircuitEntityService entityService, bool isBranchesOnly)
    {
        CAS = casApi;
        this.entityService = entityService;
        this.isBranchesOnly = isBranchesOnly;
    }
}

尝试执行模拟的测试:

[TestMethod]
public void DownNodeRediscoveredInSpectrum()
{
    var mock = new Mock<BranchCircuitStatusScheduleEntry>(_application);
    mock.CallBase = true;

    // Spectrum's artificial response with a model with the same name, but a "new" model handle
    var mockedNewlyImpairedNodes = new NetworkDeviceNodeStatus[]
    {
        new NetworkDeviceNodeStatus
        {
            // Not important
        }
    };

    mock.Setup(x =>
        x.CasOperations.GetImpairedNodesFromCASpectrumAsync()).ReturnsAsync(mockedNewlyImpairedNodes);
}

测试抛出的异常:

An exception of type 'Castle.DynamicProxy.InvalidProxyConstructorArgumentsException' occurred in Moq.dll but was not handled in user code Additional information: Can not instantiate proxy of class: NWatch.NetworkCircuits.CasOperations. Could not find a parameterless constructor.

最佳答案

让我试一试:

在模拟设置中,您并不是要模拟 BranchCircuitStatusScheduleEntry 的行为,但是 CasOperations 的行为类(class)。所以你真的需要一个 Mock<CasOperations>目的。或者更好的是 Mock<ICasOperations>正如@Jonesopolis 在他的评论中所说。

此外,在 BranchCircuitStatusScheduleEntry构造函数您正在初始化该类的实例和 CasOperations 的实例.如果你初始化 CasOperations 的实例会更好外面BranchCircuitStatusScheduleEntry构造函数并将其作为参数传递。

所以它会是这样的:

public class BranchCircuitStatusScheduleEntry : NWatchCustomScheduleEntryBase, INWatchCustomScheduleEntry
{
    public BranchCircuitStatusScheduleEntry(INWatchSchedulerApplication application, ICasOperations casOperations)
        : base(application, DevOpsScheduleFrequency.Minute, 15, 0, DevOpsScheduleFlags.Always)
    {
        CasOperations = casoperations;
    }

    public CasOperations CasOperations { get; private set; }
}

最后,您创建模拟,设置它并将其作为参数传递给 BranchCircuitStatusScheduleEntry构造函数:

var casMock = new Mock<ICasOperations>();
casMock.Setup(x => x.GetImpairedNodesFromCASpectrumAsync()).ReturnsAsync(mockedNewlyImpairedNodes);

var mock = new Mock<BranchCircuitStatusScheduleEntry>(_application, casMock.Object);
mock.CallBase = true;

请注意,这可能是 BranchCircuitStatusScheduleEntry 的最后一个实例不应是模拟对象,而应是真实对象(被测实例)。

关于c# - Moq - 不能模拟类属性的方法返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37400345/

相关文章:

c# - 在 CRM 2011 插件中模拟 IOrganizationService.Execute 的问题

c# - Moq - 是否可以在不使用 It.IsAny 的情况下设置模拟

.net - 具有 WCF 调用的单元测试服务 (MSUnit + Moq)

entity-framework-4 - 我可以使用 MOQ 模拟 Entity Framework 的 Objectresult<T>

c# - 在球体上映射图像并取回展开的等距柱状投影

c# - 按自定义顺序通过枚举订购对象

c# - System.InvalidOperationException : XmlSerializer attribute System. Xml.Serialization.XmlChoiceIdentifierAttribute 在项目中无效

c# - 如何在逐字字符串中转义“?

c# - 使用 Moq 和 NUnit ,什么是编写方法/更好的语法?

c# - 需要命名空间管理器或 XsltContext。此查询具有前缀、变量或用户定义的函数