Не уверен, как я издеваюсь над этим простым методом Save (User user) в моем .NET-коде - PullRequest
0 голосов
/ 17 марта 2011

Я все еще пытаюсь насмехаться. Сейчас я пытаюсь проверить мой метод Save на моем UserService. Таким образом, я высмеиваю свой IRepository, который использует мой класс UserService.

Чего я не получаю, так это ... если я обычно сохраняю этого пользователя в своей базе данных / хранилище, он волшебным образом получает Identity, который затем устанавливается, в мой объект экземпляра. Здесь нет ракетостроения.

Что я не понимаю, так это как издеваться? я должен заботиться? Я думал, что должен. Или ... это то, что меня это не волнует ... потому что я просто проверяю, что метод Repository вызывается ... не настолько, чтобы я получал правильные данные НАЗАД из него.

Вот мой псевдо-модульный тестовый код. (модульный тест, а не интеграционный тест .. отсюда репозиторий mock'd) ...

[TestMethod]
public void GivenANewUserWithValidData_Save_ReturnsTheSameNewUserWithAUserIdDetermined()
{
    // Arrange.
    var const string passwordSalt = "V4BXAhmHq8IMvR7K20TgoQ=="
    var user = new User 
                   {
                       DisplayName = "Test",
                       Email = "foo@foo.com",
                       PasswordSalt = passwordSalt ,
                       Password = "foobar".ToSha2Hash(passwordSalt)
                   };

    var mockUserRepository = new Mock<IRepository<User>>();
    mockUserRepository.Setup(x => x.Save(It.IsAny<User>())).Verifiable();
    // Configure this repo in our Dependency Injection.
    ObjectFactory.Inject(typeof (IRepository<User>), mockUserRepository.Object);

    // Act.
    using (new TransactionScope())
    {
        UserService.Save(user);
        UnitOfWork.Commit(); // <-- not sure about this.. currently it's still
                             //     an EntityFramework context. 
                             //     I need to change this to.. something??

        // Assert.
        Assert.IsNotNull(user);
        Assert.IsTrue(user.UserId > 0);
    }
}

и пользовательский сервис выглядит следующим образом ..

public class UserService : IUserService
{
    public UserService(IRepository<User> userRepository, 
                       ILoggingService loggingService)
    {
        // .. snip ..

        public void Save(User user) { .. }
    }
}

Есть предложения?

Ответы [ 3 ]

3 голосов
/ 17 марта 2011

Если вы проводите модульное тестирование UserService.Save(), то все, о чем должен заботиться ваш тест, это то, что хранилище вызывается.Тесты репозитория несут ответственность за проверку правильности сохранения объекта.

2 голосов
/ 17 марта 2011

На самом деле это легко сделать.Вы настраиваете объект Mock следующим образом:

mockUserRepository.Setup(x => x.Save(user)).Callback(() => user.UserId = 10); 
// mocking the value of 10 being insterted into the key

Вы можете даже продолжать использовать It.IsAny (), если хотите в настройке, но в основном все, что вам нужно сделать, это прикрепить обратный вызовконец вашего метода настройки.

1 голос
/ 17 марта 2011
> 1) How should I test a [UserService.]Save method? 
     Should I care about the result? and 
> 2) If i do care about #1 .. then how do i mock the 
     result also, so I can test that

Если репозиторий отвечает за выполнение Identity-Magic, то нет смысла высмеивать эту функцию в тесте, а затем проверять, что эта функциональность произошла в тесте. Вы хотите протестировать UserService, а не IRepository-mock .Поддумка - создать поддельный репозиторий с достаточным интеллектом, чтобы служба не вылетала и получала все требования для тестового набора.В этом случае я не думаю, что службе требуется Identity-Magic.

Если служба отвечает за выполнение Identity-Magic, то имеет смысл проверить, имеет ли идентификаторбыл установлен.

...