Как я могу ввести фиктивный объект в контейнер StructureMap? - PullRequest
0 голосов
/ 02 апреля 2020

Мне трудно передать ложный предмет в мой контейнер. Пример конкретного юнит-теста работает. Оба теста всегда используют конкретный класс. Что я делаю неправильно в примере, показанном ниже.

Я просто создаю класс-оболочку, потому что CloudStorageAccounts - это методы stati c.

Я использую Moq, StructureMap и MSTest

Менеджер класса

public class Manager
{
    private IAzureCloudStorageWrapper m_AzureCloudStorageWrapper;

    public Manager(IAzureCloudStorageWrapper azureCloudStorageWrapper)
    {
        m_AzureCloudStorageWrapper = azureCloudStorageWrapper;
    }

    public Microsoft.WindowsAzure.Storage.CloudStorageAccount Parse(string connectionString)
    {
        return m_AzureCloudStorageWrapper.Parse(connectionString);
    }

}

Реестр

public class InstanceScanner : Registry
{
    private IAzureCloudStorageWrapper m_AzureCloudStorageWrapper;

    public InstanceScanner()
    {
        Scan(_ =>
        {
            _.Assembly("Ifx");
            _.AssemblyContainingType<IAzureCloudStorageWrapper>();

            _.AddAllTypesOf<IAzureCloudStorageWrapper>().NameBy(x => x.Name.Replace("AzureCloudStorageWrapper", ""));
            _.WithDefaultConventions();

        });
    }

    [SetterProperty]
    public IAzureCloudStorageWrapper Provider
    {
        set { m_AzureCloudStorageWrapper = value; }
    }

    [SetterProperty]
    public bool ShouldCache { get; set; }
}

Интерфейс

public interface IAzureCloudStorageWrapper
{
    CloudStorageAccount Parse(string connectionString);

}

Реализация

public class AzureCloudStorageWrapperImplementation : IAzureCloudStorageWrapper
{       

    public Microsoft.WindowsAzure.Storage.CloudStorageAccount Parse(string connectionString)
    {
        return Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(connectionString);
    }   
}    

Модульные тесты

[TestMethod]
public void Container_Parse_WithMockedClass_ReturnConnectionString()
{
    string stringConnection = "UseDevelopmentStorage=true;DevelopmentStorageProxyUri=https://127.0.0.1";    
    var cloudStorageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(stringConnection);

    var container = new Container(new InstanceScanner());
    var mockAzureStorage = new Mock<IAzureCloudStorageWrapper>();
    mockAzureStorage.Setup(x => x.Parse(It.IsAny<string>()))
    .Returns(cloudStorageAccount)
    .Verifiable();

    container.With<Mock<IAzureCloudStorageWrapper>>(mockAzureStorage);
    var manager = container.GetInstance<Manager>();               
    var storage = manager.Parse(stringConnection);
    var stringConnectionResult = storage.ToString();

    Assert.AreEqual(stringConnectionResult, stringConnection);
}

[TestMethod]
public void Container_Parse_WithConcreteClass_ReturnConnectionString()
{
    var container = new Container(new InstanceScanner());
    var manager = container.GetInstance<Manager>();

    string stringConnection = "UseDevelopmentStorage=true;DevelopmentStorageProxyUri=https://127.0.0.1";
    var storage = manager.Parse(stringConnection);

    var stringConnectionResult = storage.ToString();

    Assert.AreEqual(stringConnectionResult, stringConnection);

}
...