Я использую AutoFixture с AutoMoqCustomization
и пытаюсь создать экземпляр класса, который содержит свойство только для чтения, таким образом:
public override ILog Logger { get; } = LogManager.GetLogger(typeof(MyService));
Идея в том, что я должен иметь возможность заморозить мой тест ILog
test double, используя:
var log = fixture.Freeze<Mock<ILog>>;
и убедитесь, что он был вызван позже после вызова основного метода:
log.Verify(l => l.Warn, Times.Once);
Однако, когда я вызываю fixture.Create<MyService>
, AutoFixture не заменяет свойство Logger
имитацией ILog
. Я также попытался удалить значение по умолчанию LogManager.GetLogger<etc>
, и в этом случае значение ILog
равно null
.
Другие свойства правильно заполнены тестовыми двойниками, но не это.
Для справки, интерфейс ILog
взят из среды ведения журналов ServiceStack и выглядит следующим образом:
public interface ILog
{
bool IsDebugEnabled { get; }
void Debug(object message);
void Debug(object message, Exception exception);
void DebugFormat(string format, params object[] args);
void Error(object message);
void Error(object message, Exception exception);
void ErrorFormat(string format, params object[] args);
void Fatal(object message);
void Fatal(object message, Exception exception);
void FatalFormat(string format, params object[] args);
void Info(object message);
void Info(object message, Exception exception);
void InfoFormat(string format, params object[] args);
void Warn(object message);
void Warn(object message, Exception exception);
void WarnFormat(string format, params object[] args);
}
Я также проверил, что создание Mocks вручную и настройка их с помощью Moq работает — свойство ILog
правильно заменено моим Mock, используя:
myServiceMock.Setup(s => s.Logger).Returns(myLoggerMock)
Кто-нибудь может пролить свет на это?
Этапы воспроизведения
Проверить
using ServiceStack;
using ServiceStack.Logging;
using ServiceStack.Web;
using MyApp;
[Test]
public void LogTest()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization());
var log = fixture.Freeze<Mock<ILog>>();
var request = fixture.Freeze<Mock<IRequest>>();
var response = new Mock<IResponse>();
var service = fixture.Create<MyService>();
request.Setup(r => r.Response).Returns(response.Object);
service.Post(null);
log.Verify(l => l.Warn(It.IsAny<string>()), Times.Once());
}
Класс обслуживания. Примечание. Обычно свойство Logger
имеет суффикс = LogManager.GetLogger(typeof(MyService))
, но я пропустил его на данном этапе, чтобы увидеть проблему.
using ServiceStack;
using ServiceStack.Logging;
namespace MyApp
{
public class MyService : BaseService
{
public override ILog Logger { get; }
public MyResponse Post(MyRequest request)
{
if (request != null) return new MyResponse() {Message = request.Message};
Logger.Warn("Null request object");
return null;
}
}
public abstract class BaseService : Service
{
public abstract ILog Logger { get; }
}
public class MyRequest
{
public string Message { get; set; }
}
public class MyResponse
{
public string Message { get; set; }
}
}
Если поставить точку останова на строке service.Post(null)
, вы увидите, что свойство ILog
по-прежнему имеет значение null, но другие свойства имеют моки.
Logger
конкретным классом? AutoMoq не проксирует конкретные классы: blog.ploeh.dk/2010/08/ 25/а> - person Mark Seemann   schedule 15.10.2015MyService
не имеет других свойств, но, с другой стороны, классService
не описан. Предоставьте краткий, автономный, правильный (компилируемый) пример. - person Mark Seemann   schedule 16.10.2015