2014-01-29 70 views
0

我有這樣一個類:存根在一個基類一個只讀屬性

public class Customer : CustomerBase 
{ 
    // internals are visible to test 
    internal string GenString() 
    { 
     // this actually composes a number of different properties 
     // from the parent, child and system properties 
     return this.InfoProperty.Name + DateTime.Now.ToString() + "something else"; 
    } 
} 

// this class is in a 3rd party library, but from metadata it looks like this 
public class CustomerBase 
{ 
    public Info InfoProperty { get; } 
} 

我的測試看起來是這樣的:

public class Tests 
{ 
    public void MyTest() 
    { 
     using (ShimsContext.Create()) 
     { 
      // Arrange 
      /* I shim datetime etc. static calls */ 

      Fakes.StubCustomer c = new Fakes.StubCustomer() 
      { 
       InfoProperty = new Info("Name") // <- Error here because it's readonly 
      }; 

      // Act 
      string result = c.GenString(); 

      // Assert 
      Assert.AreEqual(result, "whatnot"); 
     } 
    } 
} 

所以我的問題是,我怎麼能存根/勻場處理只讀屬性,以便我可以測試這個函數?

+0

的幾點思考所描述的Introduce Instance Delegator模式 - 我會重新考慮宣佈私有成員內部進行單元測試更加簡單,如果這是實際這裏的情況。你可以使用反射來實現它。第二,你爲什麼要存根?我的意思是,如果你已經僞裝了DateTime和InfoProperty,爲什麼不直接讓事物串聯呢? –

+1

您可以使用反射來避開訪問修飾符('private'),但這不是可取的。該屬性* readonly *出於某種原因(可能是派生值)。你應該找到一種間接設置它的方法(在構造函數中?通過2或3個其他方法?)。 – pid

+0

@KeithPayne:這是我想測試的一個合法的內部,所以這不是一個擔心。問題是,存根InfoProperty(如示例中所示)不起作用。 –

回答

0

把這個吸氣劑包裝在特定的虛擬方法中會怎樣呢?

如:

public class Customer : CustomerBase 
{ 
    // internals are visible to test 
    internal string GenString() 
    { 
    // this actually composes a number of different properties 
    // from the parent, child and system properties 
    return InfoPropertyNameGetter() + DateTime.Now.ToString() + "something else"; 
    } 

    public virtual string InfoPropertyNameGetter(){ 
    retrn this.InfoProperty.Name; 
    } 
} 

Mock<Customer> mock = new Mock<Customer>(); 
mock.Setup(m => m.InfoPropertyNameGetter()).Returns("My custom value"); 

它看起來有點像Working effectively with legacy code

相關問題