Автоложный контейнер: Насмешки Носорога и NInject

Если метод будет достаточно достаточно значительным, я буду обычно делать, он "защитил", и протестируйте его. Некоторые методы оставят частными и протестированными неявно как часть модульных тестов на общественность/защищенные методы.

6
задан cbp 30 November 2009 в 07:26
поделиться

2 ответа

Хорошо, я построил его сам, используя интеграцию Moq в качестве отправной точки. Все очень просто. Вам понадобятся эти 3 класса:

public class AutoMockingKernel : StandardKernel
{
    private readonly IMockProvider _mockProvider;

    public void Reset()
    {
        Components.Get<ICache>().Clear();
    }

    protected override bool HandleMissingBinding(Type service)
    {
        var isSelfBindable = TypeIsSelfBindable(service);

        var binding = new Binding(service)
        {
            ProviderCallback = isSelfBindable
                                ? StandardProvider.GetCreationCallback(service)
                                : _mockProvider.GetCreationCallback(),
            IsImplicit = true
        };

        if (!isSelfBindable)
            binding.ScopeCallback = ctx => null;

        AddBinding(binding);

        return true;
    }

    public AutoMockingKernel(IMockProvider mockProvider, INinjectSettings settings, params INinjectModule[] modules)
        : base(settings, modules)
    {
        _mockProvider = mockProvider;
    }

    public AutoMockingKernel(IMockProvider mockProvider, params INinjectModule[] modules)
        : base(modules)
    {
        _mockProvider = mockProvider;
    }
}

internal class RhinoMockProvider : IProvider
{
    public Type Type { get; private set; }

    /// <summary>
    /// Initializes a new instance of the <see cref="RhinoMockProvider"/> class.
    /// </summary>
    public RhinoMockProvider(Type type)
    {
        Type = type;
    }

    public object Create(IContext context)
    {
        return MockRepository.GenerateMock(Type, Type.EmptyTypes);
    }
}

public class RhinoAutoMockProvider : IMockProvider
{
    public Func<IContext, IProvider> GetCreationCallback()
    {
        return ctx => new RhinoMockProvider(ctx.Request.Service);
    }
}

Затем вы можете создать ядро ​​с автоматическим имитированием в модульном тесте следующим образом:

[Test]
public void Test()
{
    var kernel = new AutoMockingKernel(new RhinoAutoMockProvider());
    ... etc
}
6
ответ дан 9 December 2019 в 22:36
поделиться

Доступно расширение интеграции RhinoMocks .

5
ответ дан 9 December 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: