Одна короткая заметка, прежде чем я прыгну в это. Как правило, вы хотите избежать использования «строгого» макета, потому что он делает хрупкое испытание. Строгий макет вызовет исключение, если произойдет что-то, что вы явно не скажете Rhino. Также я думаю, что вы, возможно, неправильно понимаете, что именно делает Rhino, когда звоните, чтобы создать макет. Думайте об этом как о пользовательском объекте, который был либо получен из, либо реализует определенный вами тип System.Type. Если бы вы сделали это сами, это выглядело бы так:
public class FakeUserType: User
{
//overriding code here
}
Поскольку IsAdministrator, вероятно, является просто открытым свойством для типа User, его нельзя переопределить в типе наследования.
Что касается вашего вопроса, есть несколько способов справиться с этим. Вы можете реализовать IsAdministrator как виртуальное свойство в своем пользовательском классе как aaronjensen , о котором говорится следующее:
public class User
{
public virtual Boolean IsAdministrator { get; set; }
}
Это нормальный подход, но только если вы планируете наследовать от своего класса User. Кроме того, если вы не хотите подделывать других членов этого класса, они также должны быть виртуальными, что, вероятно, нежелательно.
Еще один способ сделать это - использовать интерфейсы. Если это действительно класс User, который вы хотите Mock, я бы извлек интерфейс из него. Ваш приведенный выше пример будет выглядеть примерно так:
public interface IUser
{
Boolean IsAdministrator { get; }
}
public class User : IUser
{
private UserSecurity _userSecurity = new UserSecurity();
public Boolean IsAdministrator
{
get { return _userSecurity.HasAccess("AdminPermissions"); }
}
}
public void CreateSomethingIfUserHasAdminPermissions()
{
IUser user = _mocks.StrictMock<IUser>();
SetupResult.For(user.IsAdministrator).Return(true);
// do something with my User object
}
Вы можете стать более любопытным, если хотите, используя внедрение зависимостей и IOC , но основной принцип одинаков для всех. Как правило, вы все равно хотите, чтобы ваши классы зависели от интерфейсов, а не от конкретных реализаций.
Надеюсь, это поможет. Я уже давно использую RhinoMocks в крупном проекте, поэтому не стесняйтесь задавать мне вопросы о TDD и насмешках.