2012-12-13 43 views
1

我有兩種方法在單元測試的情況下,首先插入記錄到數據庫和第二次檢索數據。我希望檢索數據的輸入參數應該是生成第一個方法的id。如何在NUnit 2.6.2中跨測試用例傳遞值?

private int savedrecordid =0; 
private object[] SavedRecordId{ get { return new object[] { new object[] { savedrecordid } }; } } 


[Test] 
public void InsertInfo() 
{ 
    Info oInfo = new Info(); 
    oInfo.Desc ="Some Description here !!!"; 
    savedrecordid = InsertInfoToDb(oInfo); 
} 

[Test] 
[TestCaseSource("SavedRecordId")] 
public void GetInfo(int savedId) 
{ 
    Info oInfo = GetInfoFromDb(savedId); 
} 

我知道每個測試用例單獨執行,單獨實例我們不能在測試方法間共享變量。

請讓我知道是否有辦法在測試用例之間共享參數。

+0

有你嘗試過'public string myProp {get; set;}'我發現如果我設置了一個Construtor來設置我需要的數據並填充一些爲我工作的getter和setter。 – EllisChadwick

+0

是的我曾嘗試創建屬性沒有鍛鍊:( – user1664857

回答

5

你描述的情況是單元測試的反模式之一:單元測試應該是獨立的,不應該依賴於它們運行的​​順序。你可以找到更多在xUnit Patterns web site

而且兩者的單元測試沒有斷言,所以他們不能證明他們是否通過與否。

它們還依賴於數據庫,即外部資源,因此它們不是單位,而是集成測試。

所以我的建議是重寫他們:

  • 使用mock object從數據庫中分離
  • InsertInfo應插入信息,並利用模擬驗證相應的插入調用與參數已執行
  • GetInfo應該使用模擬操作,返回假的record並驗證其正常工作

注: *我到B/L從數據庫操作分開...... * ...,併爲您解決一些假設

// Repository incapsulates work with Database 
public abstract class Repository<T> 
    where T : class 
{ 
    public abstract void Save(T entity); 
    public abstract IEnumerable<T> GetAll(); 
} 

// Class under Test 
public class SomeRule 
{ 
    private readonly Repository<Info> repository; 

    public SomeRule(Repository<Info> repository) 
    { 
     this.repository = repository; 
    } 

    public int InsertInfoToDb(Info oInfo) 
    { 
     repository.Save(oInfo); 

     return oInfo.Id; 
    } 

    public Info GetInfoFromDb(int id) 
    { 
     return repository.GetAll().Single(info => info.Id == id); 
    } 
} 

// Actual unittests 
[Test] 
public void SomeRule_InsertInfo_WasInserted() // ex. InsertInfo 
{ 
    // Arrange 
    Info oInfo = new Info(); 
    oInfo.Desc = "Some Description here !!!"; 

    var repositoryMock = MockRepository.GenerateStrictMock<Repository<Info>>(); 

    repositoryMock.Expect(m => m.Save(Arg<Info>.Is.NotNull)); 

    // Act 
    var savedrecordid = new SomeRule(repositoryMock).InsertInfoToDb(oInfo); 

    // Assert 
    repositoryMock.VerifyAllExpectations(); 
} 

[Test] 
public void SomeRule_GetInfo_ReciveCorrectInfo() // ex. GetInfo 
{ 
    // Arrange 
    var expectedId = 1; 
    var expectedInfo = new Info { Id = expectedId, Desc = "Something" }; 

    var repositoryMock = MockRepository.GenerateStrictMock<Repository<Info>>(); 

    repositoryMock.Expect(m => m.GetAll()).Return(new [] { expectedInfo }.AsEnumerable()); 

    // Act 
    Info receivedInfo = new SomeRule(repositoryMock).GetInfoFromDb(expectedId); 

    // Assert 
    repositoryMock.VerifyAllExpectations(); 

    Assert.That(receivedInfo, Is.Not.Null.And.SameAs(expectedInfo)); 
} 

PS:完整的例子availabel here

+0

謝謝Akim和喬我不確定模式像共享夾具是否支持nUnit 2.6.2是的我要更新與Mock對象的測試用例,並會去爲了驗證數據庫過程和查詢是分開的,在典型的情況下,測試用例必須是獨立的,在這裏我正在尋找應該測試的整個用戶故事,如果你可以提供NUnit的鏈接或引用2.6共享夾具和最佳做法將是非常有用的。再次坦克反應。 – user1664857

+1

_Shared Fixture_是一個antipatter!因此你必須避免實施它:) 查看答案更新 – Akim