2016-01-06 75 views
4

我有一個POCO類:如何通過使用It.IsIn(someRange)組合POCO屬性來迭代多個字段?

public class SomeEntity { 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

我想測試中SomeEntity類使用不同的值有一些其他類。問題是我需要測試許多屬性的不同組合。例如:

  1. ID = 1,名字= NULL,名字= 「Doe的」
  2. ID = 1,名字= 「」,名字= 「Doe的」
  3. ID = 1,名字=「約翰」,姓氏= 「李四」
  4. ID = 1,名字= NULL,名字= 「」

所以在每次測試我想創建測試對象是這樣的:

// test that someOtherObject always return the same result 
// for testObject with ID = 1 and accepts any values from range of 
// values for FirstName and LastName 

var testObject = new SomeEntity { 
    Id = 1, // this must be always 1 for this test 
    FirstName = It.IsIn(someListOfPossibleValues), // each of this values must be accepted in test 
    LastName = It.IsIn(someListOfPossibleValues) // each of this values must be accepted in test 
} 

var result = someOtherObject.DoSomething(testObject); 

Assert.AreEqual("some expectation", result); 

我不想使用nunit TestCase,因爲會有很多組合(巨大的矩陣)。

我試圖在調試中運行這個測試,並且它只使用列表中的第一個值調用DoSomething一次。

問題:我怎麼能通過所有可能的值的組合?

回答

3

您使用It.IsIn不正確;它只用於matching arguments時,即在Verify調用中檢查值是否在一組可能的值中,或者在調用Setup調用來控制Moq如何響應。它是而不是設計用於以某種方式生成一組測試數據。這正是NUnit的ValuesAttributeValueSourceAttribute的目的。

關於你反對使用NUnit是因爲組合太多,是因爲你不想編寫所有的組合,或者因爲你不想要那麼多的測試?如果是前者,則使用NUnit的屬性和CombinatorialAttribute使NUnit完成創建所有可能的測試的工作。這樣的事情:

[Test] 
[Combinatorial] 
public void YourTest(
    [Values(null, "", "John")] string firstName, 
    [Values(null, "", "Doe")] string lastName) 
{ 
    var testObject = new SomeEntity { 
     Id = 1, // this must be always 1 for this test 
     FirstName = firstName, 
     LastName = lastName 
    }; 

    var result = someOtherObject.DoSomething(testObject); 

    Assert.AreEqual("some expectation", result); 
} 

該測試將運行9次(3個數據爲每個參數,所以3 * 3)。請注意,組合是默認值。但是,如果您僅僅反對結果中測試的次數,那麼請專注於您實際想要測試的內容並編寫這些測試,而不是對每個可能的值進行快速查找。

+0

非常感謝。這就是它!我不打算「射擊」,我只是在代碼中有很多「如果」的邏輯) –

0

,因爲每個名字和姓氏的在列表中,似乎最簡單的就是隻是做2個迴路

foreach (var fname in firstNamePossibleValues) { 
    foreach (var lname in lastNamePossibleValues) { 
     var testObject = new SomeEntity { 
      Id = 1, // this must be always 1 for this test 
      FirstName = fname, // each of this values must be accepted in test 
      LastName = lname // each of this values must be accepted in test 
     } 

     var result = someOtherObject.DoSomething(testObject); 
     Assert.AreEqual("some expectation", result); 
    } 
} 
+0

10個屬性與他們自己的範圍呢? –