2016-10-21 2 views
0

Ich möchte Indexereigenschaft zurückgeben, die durch das Objekt zurückgegeben wird. Ich benutze NSubstitute für Spott. Ich habe folgendes Szenario. In der Probe wollte ich Indexer Eigenschaft dieses [string symbol] während der Rückkehr von IFeedData.GetFeedDataWie Indexer-Informationen für das zurückgegebene Objekt in NSubstitute vortäuschen

public class FeedEntity 
{ 
    private SymbolData _symbolData; 
    public string Symbol { get; set; } 

    public SymbolData this[string symbolName] 
    { 
     get //Search Data into Actual Feed and returns relevent data for Symbol 
     { 
      if (_symbolData != null) 
      { 
       _symbolData = new SymbolData//Just Created For Sample Purpose 
       { 
        TraderName = "TestTrader", 
        BrokerName = "TestBroker" 
       }; 
      } 
      return _symbolData; 
     } 

     set 
     { 
      _symbolData = value; 
     } 
    } 
} 

public class SymbolData 
{ 
    public string TraderName { get; set; } 
    public string BrokerName { get; set; } 
} 

public interface IFeedData 
{ 
    FeedEntity GetFeedData(string symbolName); 
} 

public class FeedClass : IFeedData 
{ 
    public FeedEntity GetFeedData(string symbolName) 
    { 
     return new FeedEntity 
     { 
      Symbol = "TestSymbol" 
     }; 
    } 
} 

Hauptklasse, die IFeedData sehen verspotten -

public class FeedProcesser 
{ 
     private IFeedData _feedService = new FeedClass(); 

     public FeedProcesser(IFeedData feedService) 
     { 
      _feedService = feedService; 
     } 

     public void ProcessFeedData(string symbol) 
     { 
      var feedRespnse= _feedService.GetFeedData(symbol); 
      //do feed processing logic based on Trader and Broker Information 
     } 
} 

Einheit Test Klasse als -

[TestClass] 
    public class UnitTest1 
    { 
     [TestMethod] 
     public void TestMethod1() 
     { 
      var iFeedData = Substitute.For<FeedClass>(); 
      iFeedData.GetFeedData(Arg.Any<string>()).Returns(x => new FeedEntity() { Symbol = "HHH" }); 
      var processer = new FeedProcesser(iFeedData); 
      processer.ProcessFeedData("HHH"); 

     } 
    } 

Jede Hilfe wird geschätzt!

Antwort

0

Um FeedEntity zu spotten, müssten wir alle seine Mitglieder virtual machen oder eine Schnittstelle extrahieren. Wir können dann verspotten den Indexer wie folgt aus:

var feedEntity = Substitute.For<IFeedEntity>(); 
feedEntity["ABC"] = new SymbolData(...); 
// or if it is a get-only indexer: 
feedEntity["ABC"].Returns(new SymbolData(...)); 

Wenn Sie nur FeedProcessor testen wollen, ob wir auf diesem Niveau von Detail kann nicht gehen müssen. Wir könnten stattdessen nur die IFeedData ersetzen.

[Test] 
public void TestProcessing() { 
    var feedData = Substitute.For<IFeedData>(); 
    feedData.GetFeedData("HHH").Returns(new FeedEntity(...)); 
    // Configure substitute to return a real FeedEntity. 
    // Alternatively, return a substitute IFeedEntity as described above 
    var subject = new FeedProcessor(feedData); 

    subject.ProcessFeedData(); 

    // assert correct processing 
} 
Verwandte Themen