【问题标题】:Microsoft Moles and type castingMicrosoft Moles 和类型转换
【发布时间】:2012-09-02 15:05:23
【问题描述】:

我尝试了一些单元测试并遇到了使用类实例而不是接口的测试方法的问题。在那种情况下,我发现 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。有没有办法在不使用接口和通常的模拟的情况下测试这种方法?如果有其他库可以帮助我,请提供它的名称。

【问题讨论】:

    标签: c# unit-testing moles


    【解决方案1】:

    您可以执行以下操作,而不是模拟 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,该target.Instance 代表被篡改的ClassA 实例。

    Count1(target) 起作用的原因是因为生成的摩尔类MClassA 继承自MoleBase<ClassA>,定义了以下隐式运算符:

    public static implicit operator ClassA(MoleBase<ClassA> mole) { // ... }
    

    【讨论】:

    • 谢谢。以前我也尝试使用moled类中的Instance,但它返回了原始值,但现在一切都很好。对我来说似乎很神奇。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2012-07-23
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多