Rhino.Mocks создает InvalidCastException при возврате полиморфного объекта - PullRequest
0 голосов
/ 23 июня 2010

Я использую Rhino.Mocks 3.6 впервые.Я пытаюсь создать заглушку для интерфейса, который возвращает унаследованный тип (B).Когда я пытаюсь это сделать, он генерирует 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 Ответ

1 голос
/ 23 июня 2010

Используйте 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);
        }
    }
}
...