Как выполнить юнит-тестирование сервиса, который использует PetaPoco.Database

Я использую PetaPoco в своем текущем проекте в качестве микро-ORM, и я должен сказать, что мне это нравится. Однако я столкнулся с простым сценарием - сервисами модульного тестирования, которые используют PetaPoco.Database

public class MyService : IMyService
{
    private readonly PetaPoco.Database _database;

    public MyService(PetaPoco.Database database)
    {
        _database = database;
    }

    public void SaveSomething(MyObject myObject)
    {
        //...custom logic
        _database.Save(myObject);
    }
}

Я использую IoC (Castle.Windsor) для внедрения IMyService и PetaPoco.Database везде, где это необходимо.

Теперь, когда я пытаюсь выполнить модульное тестирование своего сервиса, я не могу правильно смоделировать заглушку PetaPoco.Database , чтобы убедиться, что метод Сохранить был правильно запущен. Я использую NUnit и Rhino.Mocks для модульного тестирования и насмешек.

[TestFixture]
public class MyServiceTests
{ 

    private PetaPoco.Database _database;

    [SetUp] 
    public void SetUp()
    {
        _database = MockRepository.GenerateMock<Database>("");
    }

    [Test]
    public void ShouldProperlySaveSomething()
    {
        //Arrange
        var myObject = new MyObject();
        _database.Expect(db => db.Save(Arg<MyObject>.Is.Anything));
        var myService = new MyService(_database);

        //Act
        myService.SaveSomething(myObject);

        //Assert
        _database.VerifyAllExpectations();   
    }

}

Я знаю, что это можно решить, если я извлеку Интерфейс из PetaPoco.Database и сделаю над ним насмешки, или виртуализирую методы PetaPoco, которые я хочу издеваться, но дело в том я вообще не хочу вносить изменения в PetaPoco .

Это выполнимо?

7 голосов | спросил ljubomir 26 Maypm12 2012, 17:37:31

2 ответа


0

Моя ветка расположена здесь: https://github.com/schotime/PetaPoco уже имеет интерфейс определено для класса Database.

Также есть мой новый Fork https://github.com/schotime/NPoco или NPoco на Nuget, который имеет тот же API.

Я бы использовал один из них. ;)

ответил Schotime 28 Maypm12 2012, 12:36:00
0

Вы уже абстрагируете взаимодействия с PetaPoco.Database, используя взаимодействия IMyService, так зачем вам нужна другая абстракция? При вашем текущем подходе вы сможете проверить взаимодействие с базой данных с помощью IMyService, например.

public class AuthenticationService 
{
    private IMyService myService;

    public AuthenticationService(IMyService service) 
    {
        ...
    }

    public void Authenticate(string username, string password)
    {
       var user = myService.GetUser(username); // <-- Hits the database
    }
}

и для проверки вы просто имитируете взаимодействия, используя макет /заглушку IMyService.

Что касается вашего исходного решения, если публичные методы PetaPoco не являются виртуальными, я бы разобрал их, исправил код и отправил им запрос на извлечение. В противном случае ваш подход выглядит хорошо для меня.

ответил Hadi Eskandari 28 Mayam12 2012, 07:23:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132