代码之家  ›  专栏  ›  技术社区  ›  Thorarin

Mocks在返回多态对象时产生InvalidCastException

  •  0
  • Thorarin  · 技术社区  · 14 年前

    InvalidCastException 尝试将某个代理对象转换为基类(A)。

    例如:

    class A {}
    
    class B : A {}
    
    interface IMyInterface
    {
        A GetA();
    }
    
    // Create a stub
    var mocks = new MockRepository();
    var stub = mocks.Stub<IMyInterface>();
    Expect.Call( stub.GetA() ).Return( new B() );
    
    // This will throw an InvalidCastException
    var myA = stub.GetA();
    

    在我看来,问题在于它生成的代理类与现有类的继承结构不同。然而,在我看来,返回方法签名指定类型的子类是一种相当常见的情况。

    我试过几种不同的方法,但都没用。有什么想法吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Juliet    14 年前

    使用 mocks.Record 要设置模拟对象,请使用 mocks.PlayBack 运行测试。

    public class A { }
    
    public class B : A { }
    
    public interface IMyInterface
    {
        A GetA();
    }
    
    [TestFixture]
    public class RhinoTestFixture
    {
        [Test]
        public void TestStub()
        {
            // Create a stub
            var mocks = new MockRepository();
            IMyInterface stub;
            using (mocks.Record())
            {
                stub = mocks.Stub<IMyInterface>();
                stub.Expect(x => stub.GetA()).Return((new B()));
            }
    
            using (mocks.Playback())
            {
                var myA = stub.GetA();
                Assert.IsNotNull(myA);
            }
        }
    }