2015-09-30 40 views
0

我想看看是否有一種方式來獲得這種起訂量如何使用上SetupAllProperties得到網卡

public interface IFoo 
{ 
    int MyProp { get; } 
} 

[Fact] 
public void Test 
{ 
    var mock = new Mock<IFoo>(); 
    mock.SetupAllProperties(); 
    mock.Object.MyProp = 12; // this does not work because there is a get. 
} 

我知道我可以使用 mock.SetupGet但因爲有很多我的界面特性,我不想在他們每個人身上做SetupGet

+0

你想要所有的屬性返回'12'嗎?是「int」類型的所有屬性? –

+0

你如何使用你的模擬,以便你需要設置所有的屬性?也許你需要一個假的(虛擬數據),而不是一個模擬,你可以使用像[AutoFixture](https://github.com/AutoFixture/AutoFixture) –

+0

這似乎是你想要的只是一個普通的模擬與MockBehaviour。鬆散(這是默認的),所以我真的不明白你的問題 –

回答

0

你沒到我的評論作出迴應,但如果你想使用反射,你可以找到(相關類型的)所有屬性,並創建Setup爲每本(指令using System.Linq.Expressions;需要爲Expression類是在範圍;我們創造我們自己的表達式樹):

var mock = new Mock<IFoo>(); 

var parameterExpression = Expression.Parameter(typeof(IFoo)); 
foreach (var property in typeof(IFoo) 
    .GetProperties().Where(x => x.PropertyType == typeof(int)) 
) 
{ 
    var lambdaExpression = Expression.Lambda<Func<IFoo, int>>(
    Expression.Property(parameterExpression, property), 
    parameterExpression); 
    mock.Setup(lambdaExpression).Returns(12); 
} 

後來另外:不知道我真的明白你的問題。

如果你有多個值,強類型的許多屬性,你可以這樣做:

var mock = new Mock<IFoo>(MockBehavior.Strict); 
mock.Setup(x => x.MyProp).Returns(12); 
mock.Setup(x => x.MyOtherProp).Returns(3.14); 
mock.Setup(x => x.MyThirdProp).Returns("test"); 
... 
mock.Setup(x => x.MyLastProp).Returns(new DateTime(2015, 1, 1)); 
var objToUse = mock.Object; 

或做:

var rep = new MockRepository(MockBehavior.Strict); 
var objToUse = rep.OneOf((IFoo x) => 
    x.MyProp == 12 
    && x.MyOtherProp == 3.14 
    && x.MyThirdProp == "test" 
    && ... 
    && x.MyLastProp == new DateTime(2015, 1, 1) 
    ); 

我不認爲它可以製成不太麻煩。如果你想要一個鬆散的模擬,有var objToUse = Mock.Of((IFoo x) => x.MyProp == 12 && ...);,幾乎是一個班輪。

+0

是的,但是,這似乎是一種解決方法,看看我的回覆您的評論。 –

+0

@HarshGupta不知道我看到你的問題,但看到我上面編輯的答案。 –