如何模拟 NSubstitute 中返回对象的索引器信息
How to mock indexer information for the returned object in NSubstitute
我想通过对象模拟索引器 属性 return。我正在使用 NSubstitute 进行模拟。我有以下情况。在示例中,我想模拟索引器 属性 this[string symbolName] 而 returning from IFeedData.GetFeedData
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"
};
}
}
引用 IFeedData 的主要 Class -
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
}
}
单元测试 Class 作为 -
[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");
}
}
感谢任何帮助!
要模拟 FeedEntity
,我们需要使其所有成员 virtual
或提取一个接口。然后我们可以像这样模拟索引器:
var feedEntity = Substitute.For<IFeedEntity>();
feedEntity["ABC"] = new SymbolData(...);
// or if it is a get-only indexer:
feedEntity["ABC"].Returns(new SymbolData(...));
如果您只是想测试 FeedProcessor
,尽管我们可能不需要深入到那种程度的细节。我们可以代替 IFeedData
.
[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
}
我想通过对象模拟索引器 属性 return。我正在使用 NSubstitute 进行模拟。我有以下情况。在示例中,我想模拟索引器 属性 this[string symbolName] 而 returning from IFeedData.GetFeedData
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"
};
}
}
引用 IFeedData 的主要 Class -
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
}
}
单元测试 Class 作为 -
[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");
}
}
感谢任何帮助!
要模拟 FeedEntity
,我们需要使其所有成员 virtual
或提取一个接口。然后我们可以像这样模拟索引器:
var feedEntity = Substitute.For<IFeedEntity>();
feedEntity["ABC"] = new SymbolData(...);
// or if it is a get-only indexer:
feedEntity["ABC"].Returns(new SymbolData(...));
如果您只是想测试 FeedProcessor
,尽管我们可能不需要深入到那种程度的细节。我们可以代替 IFeedData
.
[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
}