我不确定我是否以正确的方式使用 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/