Rhino.Mocks:如何使用不同的程序集fullname

时间:2017-12-28 13:32:42

标签: c# unit-testing rhino-mocks-3.5

我尝试创建一个类的两个模拟对象,但它创建了两个具有相同程序集的模拟" FullName"。

public class MyClassA : SomeAbstractClass, ISomeInterface1, ISomeInterface2
{
    public MyClassA(string someData) : base(someData)
    {
        //this property defined in base class
        CheckId = GetType().FullName;
    }

    internal override string CheckId { get; }
}

public class TestClass
{
    [Test]
    public void TestMethod()
    {
        var stub1 = new MockRepository().StrictMock<MyClassA>("some data 1");
        var stub2 = new MockRepository().StrictMock<MyClassA>("some data 2");

        Assert.AreEqual(stub1.CheckId, stub2.CheckId);
    }
}

以上断言是正确的,我认为是假的。

我知道我可以创建另一个提供CheckId的界面,但我想用生产代码创建相同的环境。

所以我的问题是为什么rhino mock为不同的对象生成相同的类名,即使CheckId属性不同。

有没有其他方法可以在不更改测试逻辑的情况下创建同一个类的不同模拟实例?

如果您需要其他详细信息,请告诉我们。提前谢谢。

更新:已解决

我找到了比手动更新属性更好的解决方案。制作通用类型的MyClassA解决了这个问题。如下所示;

public class MyClassA<TDummy> : SomeAbstractClass, ISomeInterface1, ISomeInterface2
{
    public MyClassA(string someData) : base(someData)
    {
        //this property defined in base class
        CheckId = GetType().FullName;
    }

    internal override string CheckId { get; }
}

public class TestClass
{
    [Test]
    public void TestMethod()
    {
        var mock1 = MockRepository.GenerateMock<MyClassA<int>>("some data 1");
        var mock2 = MockRepository.GenerateMock<MyClassA<bool>>("some data 2");

        Assert.AreEqual(stub1.CheckId, stub2.CheckId);
    }
}

由于不同的虚拟类型,每个生成的mock都是相同基类型的不同实例。毕竟断言是假的,就像我预料的那样。

1 个答案:

答案 0 :(得分:0)

一种选择是手动设置属性,使其可以是唯一的

public class MyClassA : SomeAbstractClass, ISomeInterface1, ISomeInterface2 {
    public MyClassA(string someData, string checkId) : base(someData) {
        //this property defined in base class
        CheckId = checkId;
    }

    internal override string CheckId { get; }
}

这样,在模拟类时,您可以控制设置该属性

public class TestClass {
    [Test]
    public void TestMethod() {
        var stub1 = new MockRepository().StrictMock<MyClassA>("some data 1", "checkId 1");
        var stub2 = new MockRepository().StrictMock<MyClassA>("some data 2", "checkId 2");

        Assert.AreEqual(stub1.CheckId, stub2.CheckId); //Should fail.
    }
}

否则,如果要使用反射,你就可以创建多个类。

public class MyClassA : SomeAbstractClass, ISomeInterface1, ISomeInterface2 {
    //...
}

public class MyClassB : SomeAbstractClass, ISomeInterface1, ISomeInterface2 {
    //...
}

public class TestClass {
    [Test]
    public void TestMethod() {
        var stub1 = new MockRepository().StrictMock<MyClassA>("some data 1");
        var stub2 = new MockRepository().StrictMock<MyClassB>("some data 2");

        Assert.AreEqual(stub1.CheckId, stub2.CheckId);
    }
}