Я не уверен, почему вы хотите так поступить.Вам лучше было бы настроить свой фиктивный объект внутри теста и создать новый фиктивный объект для каждого теста.
на первый взгляд это может показаться более трудоемким, но с использованием подхода, описанного вышезатруднит выполнение ваших тестов, а метод GetUserRepositoryMock
будет становиться все менее и менее полезным, поскольку вы добавляете больше тестов, для которых требуется немного другое поведение.
, если вы хотите просто проверить, что эти методы не были вызваны, тогдаВы можете сделать это с помощью Isolate.Verify.WasNotCalled(x=>x.Select(null));
для каждого из методов.Я думаю, что это лучший подход, если вы настраиваете все методы для генерации исключений.
Вы можете получить что-то в соответствии с вашими предпочтениями, если ваш метод GetUserRepositoryMock
будет использовать много логических значений, которые указывают, какие методы имитироватьс throw NotImplementedException
, все по умолчанию на true.Тогда вы можете использовать именованные параметры, чтобы просто указать тот, который вы не хотите устанавливать.Что-то вроде этого:
public UserRepository GetUserRepositoryMock(bool mockSelect=true, bool mockSelectOne=true, bool mockSave=true ... etc etc)
{
// mock all UserRepository instances.
var userRepositoryMock = Isolate.Fake.Instance<UserRepository>();
Isolate.Swap.AllInstances<UserRepository>().With(userRepositoryMock);
// make all public UserRepository members throw a NotSupportedException.
if(mockSelect)
Isolate.WhenCalled(() => userRepositoryMock.Select(null)).WillThrow(new NotSupportedException());
if (mockSelectOne)
Isolate.WhenCalled(() => userRepositoryMock.SelectOne(null)).WillThrow(new NotSupportedException());
if(mockSave)
Isolate.WhenCalled(() => userRepositoryMock.Save(null)).WillThrow(new NotSupportedException());
// ... et cetera until all public members of UserRepository will throw NotSupportedException where the corresponding flag is true.
}
тогда вы можете вызывать это так в своем тесте, когда вы не хотите, чтобы SelectOne был смоделирован:
[TestMethod]
public void ActivateUser_UserNotFound_ThrowsException()
{
var userRepositoryMock = GetUserRepositoryMock(mockSelectOne:false);
// override one of the public UserRepository members to return a specific value.
Isolate.WhenCalled(() => userRepositoryMock.SelectOne(null)).DoInstead(context =>
{
return null;
});
// call ActivateUser implementation.
RegistrationServices.ActivateUser("foo@bar.com", "password", "activation-code");
}
Так что вам нужно толькоукажите вещи, которые вы хотите отличать от значений по умолчанию, используя именованные параметры.
Я не говорю, что мне особенно нравится это решение, и вполне может быть лучшее решение, использующее некоторые из собственных методов TypeMocks,но это должно дать вам то, что вы хотите.Вы можете настроить этот метод таким образом, чтобы вместо этого делать проверки Isolate.Verify.WasNotCalled()
для каждой вещи, основываясь на флагах.