2010-09-07 54 views
4

我想嘲弄使用起訂量使用起訂量

IInterfaceToBeMocked { 
IEnumerable<Dude> SearchDudeByFilter(Expression<Func<Dude,bool>> filter); 
} 
這個接口表達 >參數嘲諷方法

我的想法做一些像

_mock.Setup(method => method.SearchDudeByFilter(x=> x.DudeId.Equals(10) && X.Ride.Equals("Harley"))). Returns(_dudes);// _dudes is an in-memory list of dudes. 

,當我嘗試調試單元測試,其中我需要這個嘲弄,它說「表達不允許」指向拉姆達。如果它有什麼區別,我使用xUnit作爲測試框架。

+1

我會假設錯過的右括號是複製到網站時的錯字,而不是回答,因爲如果您在提及時進行編譯並在調試期間出現故障,我不知道它會是什麼。 – eglasius 2010-09-09 17:48:24

+0

@eglasius:現在怎麼樣? – Perpetualcoder 2010-09-11 09:23:17

回答

4

以下罰款對我的作品與Moq 4.0 Beta

public class Dude 
{ 
    public int DudeId { get; set; } 
    public string Ride { get; set; } 
} 

public interface IInterfaceToBeMocked 
{ 
    IEnumerable<Dude> SearchDudeByFilter(Expression<Func<Dude,bool>> filter); 
} 

和單元測試:

[TestMethod] 
public void TestDudes() 
{ 
    // arrange 
    var expectedDudes = new[] 
    { 
     new Dude(), new Dude() 
    }; 
    var mock = new Mock<IInterfaceToBeMocked>(); 
    mock.Setup(method => method.SearchDudeByFilter(
     x => x.DudeId.Equals(10) && x.Ride.Equals("Harley")) 
    ).Returns(expectedDudes); 

    // act 
    // Remark: In a real unit test this call will be made implicitly 
    // by the object under test that depends on the interface 
    var actualDudes = mock.Object.SearchDudeByFilter(
     x => x.DudeId.Equals(10) && x.Ride.Equals("Harley") 
    ); 

    // assert 
    Assert.AreEqual(actualDudes, expectedDudes); 
} 

現在,如果你改變的東西轉化爲實際的方法的參數調用測試將不再因爲只有參數相同,模擬方法纔會返回預期結果:

var actualDudes = mock.Object.SearchDudeByFilter(
    x => x.DudeId.Equals(20) && x.Ride.Equals("Honda") 
); 

備註:採用lambda表達式的模擬方法是一項新功能,在先前版本中我們需要使用It.Is<SomeType>It.IsAny<SomeType>參數約束。

+0

如果其中一個參數作爲參數傳遞,例如'SearchDudeByFilter(int dudeId)',那麼這個有效的調用被認爲是未驗證的,因爲表達式樹不完全匹配:'''''''''至少需要調用一次,但從未執行:method => method.SearchDudeByFilter(x => x.DudeId.Equals(6)&& x.Ride.Equals(「Harley」))執行調用:IInterfaceToBeMocked.SearchDudeByFilter(x =>(x.DudeId.Equals(value(MyFixture + <> c__DisplayClass33).dudeId)AndAlso x .Ride.Equals( 「哈利」)))' – 2014-01-09 16:46:02