Является ли это запахом кода для инъекции зависимостей и установки одного из его свойств в ваш текущий экземпляр? Я установил свой код таким образом, чтобы полностью изолировать реализацию сервиса. У меня есть серия тестов, которые все проходят (включая установку экземпляра StreamingSubscriber
в логическом классе).
Например
public class StreamingSubscriber
{
private readonly ILogic _logic;
public StreamingSubscriber(ILogic logic)
{
_logic = logic;
// Not sure I like this...
_logic.StreamingSubscriber = this;
}
public void OnNotificationEvent(object sender, NotificationEventArgs args)
{
// Do something with _logic
var email = _logic.FetchEmail(args);
// consume the email (omitted for brevity)
}
}
public class ExchangeLogic : ILogic
{
public StreamingSubscriber StreamingSubscriber { get; set; }
public void Subscribe()
{
// Here is where I use StreamingSubscriber
streamingConnection.OnNotificationEvent += StreamingSubscriber.OnNotificationEvent;
}
public IEmail FetchEmail(NotificationEventArgs notificationEventArgs)
{
// Fetch email from Exchange
}
}
Если это запах кода, как вы его исправите?
Изменить
Причина, по которой я выбрал эту реализацию, заключается в том, что я хотел бы проверить, когда было вызвано streamingConnection
из ExchangeLogic
, что она будет отправлять электронную почту. Нынешний дизайн, хотя и не идеальный, позволяет мне писать аналогичные тесты.
[Test]
public void FiringOnNotificationEvent_WillConsumeEmail()
{
// Arrange
var subscriber = new StreamingSubscriber(ConsumerMock.Object, ExchangeLogicMock.Object);
// Act
subscriber.OnNotificationEvent(It.IsAny<object>(), It.IsAny<NotificationEventArgs>());
// Assert
ConsumerMock.Verify(x => x.Consume(It.IsAny<IEmail>()), Times.Once());
}
Теперь это, очевидно, невозможно достичь без проведения полномасштабных интеграционных тестов. Если я сказал, что мой ExchangeLogic
должен использовать электронную почту.