c# - 如何为此测试生成异常?
问题描述
我正在尝试在我的应用程序中测试异常处理程序。但是我无法为构造函数生成异常。
通常,我会创建一个对象的最小起订量,然后进行设置,其中调用 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));
}
我可以用什么来强制构造函数导致异常?
解决方案
当我的双手因外部依赖或静态类型而被束缚时,我使用包装器,所以这就是我在这里使用的。由于我们无法模拟 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
}
}
推荐阅读
- spring-boot - 在 cloud-vault-config 的 Spring 引导期间未找到 DiscoveryClient
- python - 如何将不和谐消息保存为 HTML
- sqlite - 无法安装 better-sqlite3 以运行 Discord bot
- r - 在闪亮的仪表板HeaderPlus中隐藏下拉按钮
- c# - 外部注销后如何重定向到设置注销页面(openid Connect)Asp net core 3.1
- python - 在 maya/python 中传递单选按钮的名称
- vue.js - Laggy Vuetify v-checkbox
- amazon-web-services - Terraform 在创建 AWS RDS 实例时给出子网错误
- java - Hibernate:总是更新给定的记录,即使它不脏
- php - 修复 Leaflet 在生成的地图上不包括图片