Исключение в конструкторе: Rhino.Mocks.Exceptions.ExpectationViolationException: ожидаемое # 0, фактическое # 1 - PullRequest
0 голосов
/ 18 марта 2019

У меня был рабочий тест Rhino Mock для этого конструктора

    public MyClassDataAccess(IMyClassLogger logger)
    {
        _logger = logger ?? throw new ArgumentNullException("logger");
    }

Вот тест

    [TestMethod]
    public void Ctor_ValidParams_CreatesObject()
    {
        // Arrange
        IMyClassLogger logger = MockRepository.GenerateStrictMock<IMyClassLogger>();
        // Act
        var result = new MyClassDataAccess(logger);

        // Assert
        Assert.IsNotNull(result);
    }

Затем я изменил конструктор до этого

    public MyClassDataAccess(IMyClassLogger logger)
    {
        _logger = logger ?? throw new ArgumentNullException("logger");
        _database = new Database(_logger.BaseLogger);
    }

    public Database(ILogger logger)
    {
        _logger = logger ?? throw new ArgumentException(nameof(logger));
        _databaseNameConnectionString = ConfigurationManager.ConnectionStrings["DatabaseName"].ConnectionString;
    }

Теперь я получаю следующую ошибку

Сообщение: метод инициализации MyClass.Tests.DataAccess.MyClassDataAccessTests.TestInit вызвал исключение. System.Exception: System.Exception: Исключение в конструкторе: Rhino.Mocks.Exceptions.ExpectationViolationException: IMyClassLogger.get_BaseLogger (); Ожидаемый # 0, фактический # 1.

1 Ответ

1 голос
/ 18 марта 2019

Исключение вызвано тем, что вы вызвали участника в строгом макете

IMyClassLogger logger = MockRepository.GenerateStrictMock<IMyClassLogger>(); //<-- Strict Mock here

, для которого не определены ожидания.

Вы вызываете

_database = new Database(_logger.BaseLogger);

в конструкторе, но не ожидал, что он должен быть вызван, поэтому вы получите ExpectationViolationException на IMyClassLogger.get_BaseLogger(), как указано в сообщении об исключении

Вам необходимо настроить ожидание для этого члена

[TestMethod]
public void Ctor_ValidParams_CreatesObject()
{
    // Arrange
    ILogger baseLogger =  MockRepository.GenerateMock<ILogger>();
    IMyClassLogger logger = MockRepository.GenerateStrictMock<IMyClassLogger>();
    logger.Stub(_ => _.BaseLogger).Return(baseLogger);

    // Act
    var result = new MyClassDataAccess(logger);

    // Assert
    Assert.IsNotNull(result);
}
...