我尝试了一些单元测试并遇到了使用类实例而不是接口的测试方法的问题。在那种情况下,我发现MS Moles可以帮助我。但似乎他们对类型铸造情况并不友好。我发现没有信息甚至没有问题如何处理这种情况。例如:
public class ClassA
{
public int Number {get {return 10;}}
}
public class ClassB
{
public int Count1(ClassA arg) { return arg.Number; }
public int Count2(object arg) { return (arg as ClassA).Number; }
}
并在测试时
var cl = new MolesUnitTesting.Moles.MClassA();
MolesUnitTesting.Moles.MClassA.AllInstances.NumberGet = t1 => 20;
第一个Count
工作正常,返回20但是第二个返回Null
。有没有办法测试这种方法而不使用接口和通常的模拟?如果有其他lib可以帮助我,请提供它的名字。
答案 0 :(得分:0)
您可以执行以下操作,而不是模拟ClassA
类型的所有实例:
var target = new MClassA();
target.NumberGet = () => 42;
Assert.AreEqual(Count1(target), 42);
Assert.AreEqual(Count2(target.Instance), 42);
请注意,对于Count1
,您可以直接使用mole,因为它会自动转换为ClassA
实例。但是,由于Count2
收到object
,您需要明确并传递代表示例target.Instance
实例的ClassA
。
Count1(target)
起作用的原因是因为从MClassA
继承的生成的mole类MoleBase<ClassA>
定义了以下隐式运算符:
public static implicit operator ClassA(MoleBase<ClassA> mole) { // ... }