c# - 使用 Moq 验证集合中类的方法调用

标签 c# nunit moq

我不确定我是否以正确的方式使用 Moq,所以如果有人可以提供帮助,我将不胜感激。

我想测试集合中对象的 Clone() 方法的调用。测试如下所示:

[Test]
public void CloneTest()
{
    var mdFake = new Mock<MachineDecision>();
    var clonable = mdFake.As<ICloneable>();
    clonable.Setup(x => x.Clone()).Verifiable();

    var decision = new Decision()
    {
        MachineDecisions = new List<MachineDecision> { mdFake.Object }
    };

    var newDecision = (Decision) decision.Clone();

    clonable.Verify(x => x.Clone()); 
}

测试失败:Moq.MockException: 预期对模拟至少调用一次,但从未执行: x => x.Clone() 但我相信它实际上应该通过。

使用的类如下所示:

public class Decision : Entity<Guid>, ICloneable
{
    public Decision()
    {
        Id = Guid.NewGuid();
        MachineDecisions = new List<MachineDecision>();
    }

    public List<MachineDecision> MachineDecisions { get; set; }

    public object Clone()
    {
        var obj = new Decision();
        if (this.MachineDecisions != null)
        {
            obj.MachineDecisions = MachineDecisions.Select(item => (MachineDecision) item.Clone()).ToList();
        }
        return obj;
    }
}

public class MachineDecision : Entity<Guid>, ICloneable
{
    //...
}

最佳答案

有两个选项可用。

首先,您可以将方法 Clone() 实现为虚拟,您的测试将是“绿色”

public class MachineDecision : Entity<Guid>, ICloneable
{
    public virtual object Clone()
    {
        throw new NotImplementedException();
    }
}

第二,您可以从 ICloneable 接口(interface)调用 Clone() 方法:(MachineDecision)(item as ICloneable).Clone ();并且您的测试也将是“绿色”。

    public class Decision : Entity<Guid>, ICloneable
    {
        public Decision()
        {
            Id = Guid.NewGuid();
            MachineDecisions = new List<MachineDecision>();
        }

        public List<MachineDecision> MachineDecisions { get; set; }

        public object Clone()
        {
            var obj = new Decision();
            if (this.MachineDecisions != null)
            {
                obj.MachineDecisions = MachineDecisions.Select(item =>
                {
                    return (MachineDecision)(item as ICloneable).Clone();
                }).ToList();
            }
            return obj;
        }
    }

我意识到现在它不是最好的代码,但取决于你如何进一步重构它。

关于c# - 使用 Moq 验证集合中类的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20745409/

相关文章:

c# - 使用 SharpSVN 如何将文件导出到内存而不是文件系统?

c# - 如何使用逗号和小数在 C# 中格式化数字?

c# - Alpha 混合的初始屏幕在 XP 中呈现垃圾,但在 Win7 中正常工作

c# - 使用 NUnit 和 C# 进行异步单元测试

c# - 单元测试。为什么 Mock 在第二次循环迭代中返回不同的值?

c# - 最小起订量 - 最小起订量只有效一次

c# - Moq 异步回调因多个参数而失败

c# - WCF 服务 - 不要等待外部 Web 服务调用

c# - 使用 Selenium webdriver C# 为只读字段断言值

c# - 测试 ASP.NET MVC View 模型