Но мне не очень нравится последний тест, так как я никогда не буду использовать IRandomService
.
Но в этом вся суть. Вы подключаете свой локатор в методе настройки теста (аранжировка), затем ищите ключ, который не был подключен (действие), и затем проверяете, что было сгенерировано исключение (утверждение). Вам не нужно использовать типы, которые вы на самом деле собираетесь использовать, вы просто хотите получить некоторую уверенность в том, что ваш метод работает.
Также мне хотелось бы знать, есть ли какие-либо другие релевантные тесты, которые я мог бы написать для этого класса.
Ну, я собираюсь ответить на другой вопрос здесь.
Является ли шаблон локатора службы злым?
Да, это чистое зло.
Он отрицает цель внедрения зависимости, потому что не делает зависимости явными (любой класс может извлечь что-либо из локатора службы). Более того, он делает все ваши компоненты зависимыми от этого одного класса.
Это делает обслуживание невероятным кошмаром, потому что теперь у вас есть один компонент, который просто распространяется по всей вашей кодовой базе. Вы тесно связаны с этим одним классом.
Кроме того, тестирование - это кошмар. Допустим, у вас есть
public class Foo {
public Foo() { // }
public string Bar() { // }
}
и вы хотите проверить Foo.Bar
.
public void BarDoesSomething() {
var foo = new Foo();
Assert.Equal("Something", foo.Bar());
}
и вы запускаете тест, и вы получаете исключение
ServiceLocator could not resolve component Frob.
Что? О, это потому, что ваш конструктор выглядит так:
public Foo() {
this.frob = ServiceLocator.GetService<Frob>();
}
И еще и еще.
избегать, избегать, избегать.