2012-05-26 28 views
7

Tôi đang sử dụng PetaPoco trên dự án hiện tại của mình dưới dạng ORM vi mô và tôi phải nói rằng tôi thích nó. Tuy nhiên, tôi thấy mình phải vật lộn với kịch bản đơn giản - Dịch vụ kiểm tra đơn vị sử dụng PetaPoco.DatabaseCách sử dụng dịch vụ thử nghiệm đơn vị đang sử dụng 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); 
    } 
} 

Tôi đang sử dụng IoC (Castle.Windsor) cho tiêm cả IMyServicePetaPoco.Database ở bất cứ nơi nào cần thiết.

Bây giờ, khi tôi cố gắng để kiểm tra đơn vị dịch vụ của tôi tôi vẫn chưa thể đúng cách giả còn sơ khai PetaPoco.Database để xác minh rằng Lưu phương pháp đã được gọi đúng cách. Tôi đang sử dụng NUnitRhino.Mocks để kiểm tra đơn vị và chế nhạo.

[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(); 
    } 

} 

Tôi biết rằng điều này có thể được giải quyết nếu tôi trích xuất một giao diện từ PetaPoco.Database và làm mocking chống lại nó, hoặc bằng cách ảo hóa phương pháp PetaPoco rằng tôi muốn thử, nhưng vấn đề là tôi không muốn thực hiện thay đổi đối với PetaPoco.

Điều này có thể thực hiện được không?

Trả lời

4

Chi nhánh của tôi ở đây: https://github.com/schotime/PetaPoco đã có giao diện được xác định cho lớp Cơ sở dữ liệu.

Ngoài ra còn có Fork mới của tôi https://github.com/schotime/NPoco hoặc NPoco trên nuget có cùng api.

Tôi sẽ sử dụng một trong các tùy chọn này. ;)

+0

Công việc tuyệt vời @Schotime, đó chính xác là những gì tôi cần! Tôi tò mò mặc dù, có bạn đã cố gắng để tạo yêu cầu kéo để codebase gốc? – ljubomir

+0

Nhiều lần, nhưng tôi có nhiều tính năng hơn như một phần của thư viện bây giờ, với rất nhiều bản sửa lỗi để chúng gần như tách biệt nhau bây giờ. – Schotime

+0

Có phải tất cả các tính năng của petapoco đều được hỗ trợ (chẳng hạn như các mẫu) hoặc có thiếu sót không? Nó có vẻ như ngã ba của bạn cũng làm những gì plugin này không PetaPoco.RelationExtensions. Bạn đang sử dụng cùng một mã?Tôi tự hỏi là bạn không thấy có bất kỳ tài liệu nào về một số tính năng của bạn vì vậy hy vọng tôi có thể sử dụng các ví dụ từ các plugin hiện có khác. – chobo2

1

Bạn đã trừu tượng hóa tương tác với PetaPoco.Database bằng cách sử dụng tương tác IMyService, vậy tại sao bạn cần một trừu tượng khác? Với cách tiếp cận hiện tại của bạn, bạn sẽ có thể kiểm tra tương tác với cơ sở dữ liệu bằng IMyService, ví dụ:

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 
    } 
} 

và để kiểm tra nó, bạn chỉ cần giả lập tương tác bằng cách sử dụng mô hình/nhánh của IMyService.

Bây giờ liên quan đến giải pháp ban đầu của bạn, nếu phương pháp công khai của PetaPoco không phải là ảo, tôi sẽ chia nhỏ nó, sửa mã và gửi yêu cầu kéo. Nếu không, cách tiếp cận của bạn có vẻ ổn với tôi.

+1

Cảm ơn câu trả lời của bạn @Hadi. Điểm tôi đang đặt câu hỏi này nằm trong thực tế là tôi muốn thử nghiệm logic nghiệp vụ MyService một mình, tức là tôi không muốn nhấn vào cơ sở dữ liệu, và đồng thời tôi muốn đảm bảo rằng các cuộc gọi cơ sở dữ liệu được kích hoạt thông qua PetaPoco. Cách tôi nhìn thấy nó, điều này chỉ có thể bằng cách chế nhạo ** PetaPoco.Database **. – ljubomir

+0

Việc phân phối mã, mặt khác có vẻ như là một giải pháp tốt cho tôi, tôi có thể thử. – ljubomir

Các vấn đề liên quan