Используя Rhino Mocks, как проверить значение поля Struct в параметре, передаваемом фиктивному объекту? - PullRequest
2 голосов
/ 29 июля 2011

В Rhino Mocks я тестирую метод Store в классе Subject. Subject.Store (Member) внутренне вызывает IStore.Store (Person). Как проверить, что параметр имени, который я установил для члена, является тем же именем, которое присутствует в параметре Person в вызове IStore.Store (Person).

Очевидно, что в структуре будет реализован метод Equals, а затем будет вызван Arg.Is.Equals. Но у меня нет контроля над исходным кодом для структур Person или Member.

Вот фрагмент кода ..

struct Person {
        string name;
        int age;
        char sex;
    }

    struct Member {
        string name;
        string address;
        string departnemt;

        public Member(string name, string address, string departnemt) {
            // TODO: Complete member initialization
            this.name = name;
            this.address = address;
            this.departnemt = departnemt;
        }
        //other methods
    }

    interface IStore {
        void Store(Person p);
        //other methods
    }

    class Subject {
        IStore db;
        public void Store(Member m) {
            //some logic to convert Member to Person
            Person p = GetPersonFromMember(m);
            db.Store(p);
        }

        //other methods
    }

[Test]
        public void TestStore() {
            //Arrange
            Member m = new Member("dave", "crawford Ave", "Physics");

            var mockStore = MockRepository.GenerateMock<IStore>();
            mockStore.Expect(x => x.Store(Arg<Person>.Is.NotNull));
            //here i also want to check that the Person.Name is "dave"
            //how can i do this?

            //Act
            subject.Commit();

            //Assert
            mockStore.VerifyAllExpectation();
        }

1 Ответ

6 голосов
/ 29 июля 2011

Вместо или в дополнение к Arg<Person>.Is.NotNull вы можете сделать Arg<Person>.Property.Value("Name", m.Name)

Также, предполагая, что вы делаете .Net 3.5 или выше, вы можете делать то, что, по вашему мнению, может или не может считаться лучше и которого следует избегатьстрока с именем свойства: Arg<Person>.Matches(p => p != null && p.Name == m.Name)

...