Предположим, у меня есть следующий объект:Mocking Guid.NewGuid()
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public Guid UserGuid { get; set; }
public Guid ConfirmationGuid { get; set; }
}
И следующий метод интерфейса:
void CreateUser(string username);
Часть реализации должны создать два новых GUIDs: один для UserGuid
, и другой для ConfirmationGuid
. Они должны сделать это, установив значения в Guid.NewGuid()
.
Я уже отведенной Guid.NewGuid() с помощью интерфейса:
public interface IGuidService
{
Guid NewGuid();
}
Так что я могу легко высмеивать это, когда только один новый GUID необходим. Но я не уверен, как издеваться над двумя разными вызовами одного и того же метода из одного метода, чтобы они возвращали разные значения.
Но разве это не предполагало, что я устанавливаю свойства в реализации в определенной последовательности? Разве это не замутнение проблемы моего теста? Другими словами, эти поля могут быть установлены в любом порядке, и если по какой-то причине я изменю этот порядок без обновления моих тестов, мои тесты в идеале должны пройти. –
Ну ... вы немного входите в состояние против поведенческого тестирования. Я не знаю, как еще ответить на этот вопрос, не сделав предположения о том, как заказать порядок звонков. –
Если я правильно понимаю, вы не хотите иметь 'Assert.AreEqual (guid1, user.UserGuid); Assert.AreEqual (guid2, user.ConfirmationGuid); 'fail, если вы измените порядок назначения. Вместо этого вы должны использовать некоторый тип утверждения коллекции, который не зависит от порядка (доступен как в nunit, так и в mstest): 'CollectionAssert.AreEquivalent (new [] {guid1, guid2}, new [] {user.UserGuid, user.ConfirmationGuid}) ; ' –