Как создать интерфейс, который хранит некоторые методы для тестирования в C #?
Рассмотрим следующий класс
public class Entity {
public void Foo() { ... }
internal void Bar() { ... }
}
Как вы видите, он имеетpublic
метод иinternal
метод. Теперь я хотел бы создать интерфейс, который позволит мне макетировать этот класс в тестах (как в этой сборке, так и в других). Я переписал свой код следующим образом:
public interface IEntity {
void Foo();
}
internal class Entity : IEntity {
public void Foo() { ... }
public void Bar() { ... }
}
Однако это создает другую проблему. При использовании класса в другом методе в той же сборке я не могу вызватьBar
больше:
public class OtherClass {
public void SomeMethod(IEntity entity) {
entity.Bar(); // error!
}
}
Переписать код так:
public class OtherClass {
public void SomeMethod(IEntity entity) {
(entity as Entity).Bar(); // error in test!
}
}
вызовет ошибку в модульном тесте, который запускаетSomeMethod
, Как мне переписать свой код, чтобы я все еще мог использоватьinternal
методы в той же сборке и, тем не менее, открывают только открытых членов другим сборкам?
Обновить: КлассOtherClass
это служебный класс, который должен работать на внутреннихEntity
класс, который не выставляется пользователям напрямую. Однако сам этот класс доступен пользователям, поэтому они косвенно имеют доступ к внутреннимEntity
, Это желательно какSomeMethod
будет выполнять необходимые проверки, чтобы пользователи не испортили внутреннее состояниеEntity
объект.