Как создать исключение для этого теста? - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь проверить обработчик исключений в моем приложении. Однако я не могу сгенерировать исключение для конструктора.

Обычно я создаю moq объекта, а затем выполняю настройку, при которой вызов Object.method генерирует исключение. Затем просто определите исключение в тесте.

Однако в этом конструкторе единственный вызов:

CredentialProfileStoreChain.TryGetAWSCredentials

CredentialProfileStoreChain.TryGetAWSCredentials не может быть переопределен, поэтому я не могу использовать установку moq для генерации исключения.

Код:

public class AWSDynamoDbManager : IAWSDynamoDbManager
{
    private readonly ILogger _logger;
    private readonly AmazonDynamoDBClient _dynamoDbClient;
    //NOTE:  This setting is in the app.config of the calling application so that different uses can use different profiles
    private readonly string _awsProfileName = ConfigurationManager.AppSettings["AWSProfileName"];

    public AWSDynamoDbManager(CredentialProfileStoreChain chain, ILogger logger)
    {
       this._logger = logger;

       try
       {
           AWSCredentials awsCredentials;
           chain.TryGetAWSCredentials(_awsProfileName, out awsCredentials);
           _dynamoDbClient = new AmazonDynamoDBClient(awsCredentials, RegionEndpoint.EUWest2);
       }
       catch (Exception e)
       {
           logger.Error("Could Not Open DynamoDB");
           logger.Error("Error: " + e.Message);
           throw;
       }
   }
}

Тест:

public void TestToSeeIfWeCatchTheExceptionIfWeCannotConnectToTheDatabase()
    {
        // arrange
        var mockLogger = new Mock<ILogger>();
        var mockChain = new Mock<CredentialProfileStoreChain>();

        // act / assert
        Assert.Catch<ArgumentException>(() => new AWSDynamoDbManager(mockChain.Object, mockLogger.Object));
    }

Что я могу использовать, чтобы конструктор вызвал исключение?

1 Ответ

0 голосов
/ 07 февраля 2020

когда мои руки связаны из-за внешней зависимости или типа c, я использую оболочку, вот что я бы использовал здесь. поскольку мы не можем издеваться над CredentialProfileStoreChain, мы бросаем его в обертку и используем обертку.

public interface ICredentialProfileStoreChainWrapper
{
    void TryGetAWSCredentials(/*TODO*/);
}
public class CredentialProfileStoreChainWrapper
{
    readonly CredentialProfileStoreChain _Chain;
    public CredentialProfileStoreChainWrapper(CredentialProfileStoreChain chain)
    {
        _Chain = chain;
    }
    public void TryGetAWSCredentials(/*TODO*/)
    {
        _Chain.TryGetAWSCredentials(/*TODO*/);
    }
}
public class AWSDynamoDbManager : IAWSDynamoDbManager
{
    public AWSDynamoDbManager(ICredentialProfileStoreChainWrapper chainWrapper, ILogger logger)
    {
        //TODO
        chainWrapper.TryGetAWSCredentials(/*TODO*/);
    }
}
public class Tests
{
    [Test]
    public void TestToSeeIfWeCatchTheExceptionIfWeCannotConnectToTheDatabase()
    {
        var wrapper = new Mock<ICredentialProfileStoreChainWrapper>();
        var logger = new Mock<ILogger>();
        var manager = new AWSDynamoDbManager(wrapper.Object, logger.Object);
        wrapper.Setup(s => s.TryGetAWSCredentials(/*TODO*/)).Throws(new Exception());
        //TODO
    }
}
...