Сегодня я писал модульный тест для одного из моих классов с параметром IConfiguration в конструкторе.Я пытался заморозить зависимость и создать sut.
configuration = builders.Freeze<IConfiguration>();
apiConfiguration = builders.Create<IAPIConfiguration>();
Когда я запустил тест, я получил исключение, потому что в конструкторе конфигурации API у меня есть строка проверки.
this.API_KEY = configuration["API:Key"] ?? throw new NoNullAllowedException("API key wasn't found.");
Кажется, что это не издевалось правильно или, по крайней мере, так, как я хотел.Я начинаю задаваться вопросом, есть ли способ макетировать класс IConfiguration с настраиваемыми ключами?
ОБНОВЛЕНО:
SUT:
public class APIConfiguration : IAPIConfiguration
{
public APIConfiguration(IConfiguration configuration)
{
this.API_KEY = configuration["API:Key"] ?? throw new NoNullAllowedException("API key wasn't found.");
this._url = configuration["API:URL"] ?? throw new NoNullAllowedException("API key wasn't found.");
}
public string API_KEY { get; }
private string _url
{
get { return this._url; }
set
{
if (string.IsNullOrWhiteSpace(value))
throw new NoNullAllowedException("API url wasn't found.");
this._url = value;
}
}
public Uri URL
{
get
{
return this.URL;
}
private set
{
value = new Uri(this._url);
}
}
}
Тестовый пример:
[TestClass]
public class UnitTest1
{
private readonly IFixture builders;
private readonly string _apiKey;
private readonly string _url;
private readonly IAPIConfiguration apiConfiguration;
private readonly IConfiguration configuration;
public UnitTest1()
{
builders = new Fixture().Customize(new AutoMoqCustomization());
_apiKey = builders.Create<string>();
_url = builders.Create<string>();
configuration = builders.Freeze<IConfiguration>();
configuration["API:Key"] = "testKey";
configuration["API:URL"] = "testUrl";
apiConfiguration = builders.Build<IAPIConfiguration>().Create();
}
[TestMethod]
public void TestMethod1()
{
Assert.AreSame(configuration["API:Key"], apiConfiguration.API_KEY);
}
}
Проверка тормозов в конструкторетеста на линии
apiConfiguration = builders.Build<IAPIConfiguration>().Create();