2013-11-26 35 views
1

我有一個簡單的Silverlight單元測試不按預期方式工作:Telerik的JustMock不調用預期排列方法

DataContext context = Mock.Create<DataContext>(Constructor.Mocked); 

List<Resource> resources = new List<Resource>(); 

     Resource resource = new Resource 
     { 
      ContentType = "string", 
      Data = Encoding.UTF8.GetBytes("Test") 
     }; 


    Mock.Arrange(() => context.Resources.Add(resource)).DoInstead(() => resources.Add(resource)); 

Mock.Arrange(() => context.Resources.SingleOrDefault()).Returns(resources.SingleOrDefault()); 


context.Resources.Add(resource); 

var loaded = context.Resources.SingleOrDefault(); 

資源屬性已正確添加到本地資源(context.Resources.Add (資源))列表,但是當我試圖讀回(context.Resources.SingleOrDefault())時,沒有任何東西會被返回。

+0

您使用的是什麼版本的JustMock?如果您使用精簡版版本,您可能無法訪問某些高級嘲諷/殘段? – Spock

+0

這是Q3 SP1版本。我們正在使用JustMock的完整商業版本。 – tomsky

+0

您不必SingleOrDefault。請參閱下面的答案。 – Spock

回答

3

爲了返回resources.SingleOrDefault()更新值,你將需要使用lambda表達式的安排,就像這樣:

Mock.Arrange(() => context.Resources.SingleOrDefault()) 
    .Returns(() => resources.SingleOrDefault()); 

否則,當context.Resources.SingleOrDefault()方法被調用時,模擬將返回null,這是在安排時撥打resources.SingleOrDefault()的價值。

2

我不認爲你應該對.SingleOrDefault進行存根操作。它是.NET FW System.Lynq擴展,並且經過了充分測試。爲什麼我的意思是經過很好的測試意味着這種方法根本沒有真正的意義。你總是假設它總是給SingleOrDefault實例。

使用您的單元測試,您可以對由資源返回的集合List進行存根。然後只需訪問SingleOrDefault。以下測試通過

[TestMethod] 
    public void YourReadableTestMethod() 
    { 
     var context = Mock.Create<DataContext>(Constructor.Mocked); 
     context.Resources = new List<Resource>(); 
     var resources = new List<Resource>(); 

     var resource = new Resource { 
      ContentType = "string", 
      Data = Encoding.UTF8.GetBytes("Test") 
     }; 
     resources.Add(resource); 

     Mock.Arrange(() => context.Resources).ReturnsCollection(resources); 


     context.Resources.Add(resource); 

     var loaded = context.Resources.SingleOrDefault(); 
     Assert.IsNotNull(loaded); 
    } 
相關問題