Разрешение зависимостей через UnityAutoMoqContainer - PullRequest
0 голосов
/ 03 сентября 2011

Я начал использовать UnityAutoMoqContainer Вот ссылка и у меня есть ниже 2 вопросов, в частности, в отношении контейнера. Вызов GetMock ().

  1. Я ожидаю, что приведенный ниже Assert будет успешным, однако он выдаст исключение.

    private UnityAutoMoqContainer container;
    
    [SetUp]
    public void SetUp()
    {
        container = new UnityAutoMoqContainer();
    }
    
    [Test]
    public void Are_mocks_Same(){
    
        var serviceMock = new Mock<IService>();
        var getMock = container.GetMock<IService>();             
        Assert.AreSame(getMock, serviceMock);
    }
    

Ошибка 1 Тест 'UnityAutoMoq.Tests.UnityAutoMoqContainerFixture.Are_mocks_Same' не удалось: ожидается: то же, что и при UnityAutoMoq.Tests.UnityAutoMoqContainerFixture.Are_mocks_Same () в C: \ Users ......

.

Так почему же, когда «Ожидаемый» и «Но был» одинаковы, все равно возникает исключение?

Разница, которую я вижу, состоит в том, что GetMock использует Unity для разрешения зависимостей i, e Resolve () , где new Mock не имеет. Но я не могу объяснить свою причину этого исключения.

  1. Разрешение абстрактных типов:

    Я использую Moq.Mock для разрешения абстрактного типа, как показано ниже.

        var httpContextBaseMock = new Mock<HttpContextBase>();
    

Однако приведенный ниже вызов UnityAutoMoqContainer вызывает исключение:

        var mock = container.GetMock<HttpContextBase>();

Не удалось разрешить зависимость, тип = "System.Web.HttpContextBase", name = "(none)". Произошло исключение пока: пока решаю. Исключение: InvalidOperationException - The Тип HttpContextBase не может быть создан. Вы должны настроить контейнер для подачи этого значения.

Вопрос в том, почему контейнер не способствует возвращению смоделированного абстрактного типа?

1 Ответ

1 голос
/ 03 сентября 2011

Метод AreSame проверяет, что на один и тот же объект ссылаются оба аргумента. Когда вы делаете

var serviceMock = new Mock<IService>();
var getMock = container.GetMock<IService>();
Assert.AreSame(getMock, serviceMock);

вы создаете два разных объектов, и они никогда не будут одинаковыми ссылками. Контейнер automock не может знать об экземпляре, который вы создали, без использования контейнера. Однако это удастся:

var mock1 = container.GetMock<IService>();
var mock2 = container.GetMock<IService>();
Assert.AreSame(mock1, mock2);

Неспособность создавать макеты из абстрактных типов - это ошибка, но она должна быть исправлена. Если вы обновитесь до v2.1.0, он должен работать должным образом.

Надеюсь, это поможет!

-Томас

...