Vì vậy, về cơ bản tôi có một đối tượng miền và một kho lưu trữ chung có thể thực hiện các hoạt động CRUD với đối tượng đó.Làm thế nào tôi có thể tạo một BaseTest chung với NUnit mà tôi có thể kế thừa và có các thử nghiệm từ chạy cơ sở?
public interface IBaseRepository<T> where T : BaseEntity
{
void Add(T entity);
void Remove(T entity);
T ById(int id);
IEnumerable<T> All();
}
Vì vậy, tôi có một số triển khai của giao diện này, một cho mỗi đối tượng miền.
Tôi muốn viết một số bài kiểm tra tích hợp (sử dụng nunit) và cho rằng tôi figured tôi muốn tạo ra một BaseRepositoryTest - như thế này:
public abstract class BaseRepositoryTests<T> where T : BaseEntity
{
public abstract IBaseRepository<T> GetRepository();
public abstract T GetTestEntity();
[Test]
public void AddWhenCallingAddsObjectToDatabase()
{
IBaseRepository<T> repository = GetRepository();
T entity = GetTestEntity();
repository.Add(entity);
}
}
Bây giờ, đối với mỗi đối tượng miền tôi sẽ phải thực hiện như thế nào để khởi tạo Kho lưu trữ và cách tạo một thực thể thử nghiệm, có vẻ công bằng, được cho là khác nhau ...
Tất cả những gì tôi phải làm bây giờ là viết thử nghiệm thực tế đúng không? Như thế này:
[TestFixture]
public class FooRepositoryTests: BaseRepositoryTests<Foo>
{
public override IBaseRepository<Foo> GetRepository()
{
throw new NotImplementedException();
}
public override Foo GetTestEntity()
{
throw new NotImplementedException();
}
}
Điều này sẽ giúp tôi bắt đầu và thử nghiệm không thành công vì tôi sẽ thực hiện phương pháp không may mắn. Nhưng những người thử nghiệm (đã thử cả hai nunits GUI và runner thử nghiệm resharpers) chỉ cần bỏ qua bài kiểm tra cơ bản của tôi! Nó xuất hiện và tất cả - nhưng được báo cáo lại là Bị bỏ qua.
Vì vậy, tôi đã làm một chút đào ... NUnit có tài sản này trên TextFixtureAttribute cho phép bạn chỉ định những loại bạn đang thử nghiệm vì vậy tôi đã cố gắng đặt thuộc tính
[TestFixture(typeof(Foo))]
Mở đầu tiên cơ sở và cũng là phiên bản Foo. Khi đặt trên phiên bản Foo nó vẫn chỉ bỏ qua các thử nghiệm từ các cơ sở, và khi tôi đặt nó trên cơ sở ... nó sẽ chuyển sang màu đỏ bởi vì các phương pháp ném ngoại lệ, mà sẽ là tốt ngoại trừ ngay cả khi tôi thực hiện thực tế trong FooTests, chúng vẫn không hoạt động (rõ ràng là bài kiểm tra Base cho thuộc tính TestFixture sẽ không bao giờ biết những lớp nào được kế thừa từ nó, vì vậy làm thế nào nó biết để tìm cách triển khai thực hiện).
Vì vậy, tôi phải làm gì? Tôi có thể làm bài kiểm tra trong lớp thử nghiệm cơ sở ảo và sau đó ghi đè lên nó trong FooBaseRepositoryTests, chỉ để gọi thực hiện từ cơ sở, mà là một giải pháp què mà tôi nghĩ ...
Còn gì nữa? Tui bỏ lỡ điều gì vậy? Xin hãy giúp đỡ, một người nào đó ... :)
Tôi thấy điểm của bạn, cảm ơn :) Nó không giải quyết vấn đề của tôi mặc dù, như AbstractFixtureBase chiến thắng ' t có thể có logic cho "AddWhenCallingAddsObjectToDatabase()", làm cho tôi viết việc thực hiện gần như giống nhau cho tất cả các đồ đạc có nguồn gốc ... –
Tôi đang gắn cờ câu trả lời của bạn là đúng. Tôi đoán nó không thể với NUnit vì vậy điều này thực sự cho tôi thấy cách API hoạt động. –