簡體   English   中英

如何使用NUnit創建一個通用的BaseTest,我可以繼承它並從基本運行中進行測試?

[英]How can I create a generic BaseTest with NUnit that I can inherit from and have tests from the base run?

所以基本上我有一個域對象和一個可以用該對象進行CRUD操作的通用存儲庫。

public interface IBaseRepository<T> where T : BaseEntity
{
    void Add(T entity);
    void Remove(T entity);
    T ById(int id);
    IEnumerable<T> All();
}

所以我有幾個這個接口的實現,每個域對象一個。

我想寫一些集成測試(使用nunit),為此我想我會做一個BaseRepositoryTest - 像這樣:

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

現在,對於每個域對象,我將不得不實現如何初始化存儲庫以及如何創建測試實體,這似乎是公平的,因為它們會有所不同......

我現在要做的就是編寫實際的測試夾具嗎? 像這樣:

[TestFixture]
public class FooRepositoryTests: BaseRepositoryTests<Foo>
{
    public override IBaseRepository<Foo> GetRepository()
    {
        throw new NotImplementedException();
    }

    public override Foo GetTestEntity()
    {
        throw new NotImplementedException();
    }
}

這應該讓我開始並給我一個失敗的測試,因為throw將打破它(我也嘗試實際實現方法沒有運氣)。 但是測試人員(嘗試了nunits GUI和resharpers測試跑步者)只是忽略了我的基礎測試! 它顯示了所有 - 但報告為已忽略。

所以我做了一點挖掘... NUnit在TextFixtureAttribute上有這個屬性,讓你指定你正在測試的是什么類型,所以我試着把屬性

[TestFixture(typeof(Foo))]

首先是Base,還有Foo版本。 當放在Foo版本時,它仍然只是忽略了從基礎的測試,當我把它放在基礎上...好吧它變成紅色因為方法拋出異常,這將是好的,除非即使我做實際的實現在FooTests中,它們仍然無法工作(顯然,基於TestFixture屬性的Base測試永遠不會知道哪些類繼承它,所以如何知道找到實現)。

那么我該堅持做什么? 我可以在基礎測試類虛擬中進行測試,然后在FooBaseRepositoryTests中覆蓋它,只是從base調用實現,這是一個蹩腳的解決方案,我認為......

還需要做什么? 我錯過了什么嗎? 請幫忙,有人...... :)

我最近遇到了這個問題,發現了一個不同的解決方法。 我有一個通用的IRepository接口,我希望能夠使用多個實現進行測試,因此我創建了一個在安裝過程中忽略自身的基類,但是這個行為被其后代覆蓋:

[TestFixture]
public class AbstractRepositoryTests
{
    protected IRepository _repository;

    [SetUp]
    public virtual void SetUp()
    {
        Assert.Ignore();
    }

    [Test]
    public void AddToRepository()
    {
        // Place logic using _repository here
    }
}

然后我覆蓋我的后代中的安裝行為來實例化一個存儲庫對象而不是忽略所有測試:

public class InMemoryRepositoryTests : AbstractRepositoryTests
{
    [SetUp]
    public override void SetUp()
    {
        _repository = new InMemoryRepository<string>();
    }
}

派生類將正確運行其所有父測試。 關於這一點的唯一稍微混亂的部分是基類創建了一堆“忽略”測試,這不是很干凈。

當你在fixture類上使用屬性[TestFixture(typeof(Foo))]時,為了將它用於不同的類型; 它不應該是抽象的。

如果在Foo fixture上使用,該類應該是通用的,而不是為Foo鍵入。

來自文檔:

[TestFixture]
public class AbstractFixtureBase
{
    ...
}

[TestFixture(typeof(string))]
public class DerivedFixture<T> : AbstractFixtureBase
{
    ...
}

http://www.nunit.org/index.php?p=testFixture&r=2.5.5

我沒有嘗試過你的例子但你可以嘗試將屬性TestFixture和Test放在同一個類中。 還要嘗試將其放入基類中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM