Заглушка собственности получить с помощью Rhino Mocks - PullRequest
22 голосов
/ 09 августа 2011

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

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

Ниже приведен скелет кода.Если я раскомментирую строку «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");
        }
    }

Ответы [ 2 ]

33 голосов
/ 09 августа 2011

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

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

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

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

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

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

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

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

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

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

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

4 голосов
/ 09 августа 2011

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

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

Это заставит его вернуть «test» для любого вызова геттера StoreDeviceID.

...