Подтвердить что ты не робот

Превращение объекта с использованием Rhino Mocks

Используя RhinoMocks, я пытаюсь заглушить значение getter свойства. Свойство определяется как часть интерфейса с доступом только с геттером.

Однако я получаю сообщение об ошибке "Недействительный вызов, последний вызов был использован или звонок не был выполнен (убедитесь, что вы вызываете метод виртуального (С#)/Overridable (VB)". Я понимаю, это может означать, что свойство я stubbing не является виртуальным; Однако это часть интерфейса, и я не уверен, что именно по этой причине я получаю эту ошибку.

Ниже приведен код скелета. Если я раскомментирую строку, которая говорит "stubRepository.Stub(x = > x.StoreDeviceID).PropertyBehavior();", то я получаю новую ошибку "Свойство должно быть прочитано/записано". Я искал SO и нашел эту страницу. Но предлагаемое решение мне не помогает. Любые мысли?

public interface IStore {
        string StoreDeviceID {get;}
        //other methods
    }

    public static class Store {
        private IStore Repository;

        public void SetRepository(IStore rep){
            Repository = rep;
        }

        public StoredeviceID {
            get{
                return Repository.StoreDeviceID;
            }
        }

        //other methods
    }

    public class TestClass {
        [Test]
        public void TestDeviceID() {
            var stubRepository =
                MockRepository.GenerateStub<IStore>();
            Store.SetRepository(stubRepository);

            //stubRepository.Stub(x => x.StoreDeviceID).PropertyBehavior();
            SetupResult.For(stubRepository.StoreDeviceID).Return("test");

            Assert.AreSame(Store.StoreDeviceID, "test");
        }
    }
4b9b3361

Ответ 1

Так как это свойство только для чтения, вам нужно сказать:

stubRepository.Stub(x => x.StoreDeviceID).Return("test");

Обычно с заглушками свойства используются как обычные свойства С#. Поэтому для свойств, отличных от readonly, вы бы сказали: stubRepository.someProperty = "test";

Также обратите внимание, что если вы хотите настроить метод, чтобы вести себя определенным образом, независимо от того, является ли он макетом или заглушкой, вы всегда будете говорить:

stubRepository.Stub(x => x.someMethod()).Return("foo");

Помните, что заглушки существуют, чтобы поставлять ваши модульные тесты с их необходимыми зависимостями, но не существует для проверки версий; что за то, что надо.

Используйте заглушку, когда вы хотите указать зависимость, которая ведет себя определенным образом. Используйте макет, если вы хотите проверить правильность взаимодействия определенной зависимости.

Из (выдающегося) Rhino Wiki:

Макет - это объект, на который мы можем установить ожидания, и который будет убедитесь, что ожидаемые действия действительно произошли. Заглушка - это объект, который вы используете для перехода к тестируемому коду. Ты можешь установить на него ожидания, поэтому он будет действовать определенным образом, но те ожидания никогда не будут проверены. Свойства заглушки будут автоматически ведут себя как обычные свойства, и вы не можете установить ожидания от них.

Если вы хотите проверить поведение тестируемого кода, вы используйте макет с соответствующим ожиданием и убедитесь в этом. если ты хотите просто передать значение, которое может потребоваться определенным образом, но не является фокусом этого теста, вы будете использовать заглушку.

ВАЖНО: заглушка никогда не приведет к сбою теста.

Ответ 2

Вы можете сделать следующее с заглушкой:

stubRepository.Stub(x => x.StoreDeviceID).Return("test");

Это приведет к возврату "теста" для любого вызова получателя StoreDeviceID.