当我尝试存根重载的构造函数时 NSubstitute 崩溃
NSubstitute crashes when I try to stub an overloaded constructor
我声明了以下 class 和构造函数:
public class StoryProvider : ReportProviderBase<StoryProvider>, IStoryProvider
{
public StoryProvider(ICommonComponents<StoryProvider> common)
: base(common)
{
Common.Logger.LogTrace("Instantiating StoryProvider");
}
public StoryProvider(ICommonComponents<StoryProvider> common, IEvalReports reports)
: base(common)
{
Reports = reports;
Common.Logger.LogTrace("Instantiating StoryProvider");
}……
基础class有如下声明:
public abstract class ReportProviderBase<T> : IDisposable
where T : class
{
public IEvalReports Reports { get; set; }
protected ICommonComponents<T> Common { get; }
protected ReportProviderBase(ICommonComponents<T> common)
{
Common = common;
CreateProfileServerComInstance();
}…..
使用 Nsubstitute 我声明:
ICommonComponents<StoryProvider> common = GetCommonComponents<StoryProvider>();
var reports = Substitute.For<IEvalReports>();
现在如果我调用我的测试方法:
var provider = await Substitute.For<StoryProvider>(common).HeadlineNewsContentAsync(request);
它在 HeadlineNewsContentAsync
中失败,因为 Reports 尚未实例化。
我真的很想用我重载的构造函数调用它:
var provider = await Substitute.For<StoryProvider>(common, reports).HeadlineNewsContentAsync(request);
此时它只是崩溃并显示 TestInvoker.cs 未找到。很明显,我以错误的方式附加了 reports
,我应该如何更改对此方法的调用,以便它使用我重载的构造函数
下面是被测函数:
public HeadlineStoriesResponse HeadlineNewsContent(FrontPageContentRequest request)
{
EnsureConnectedToProfileServer(request.SessionId);
var requestXml = request.XSerialise();
var success = Reports.FrontPageOperation(requestXml, out var responseXml);
if (!success || string.IsNullOrEmpty(responseXml) || responseXml.Contains("<FRONTPAGE_CONTENT/>"))
return new HeadlineStoriesResponse { IsSuccess = false };
var xml = responseXml.GetNodeFromXmlString("FRONTPAGE_CONTENT//HEADLINE_STORIES");
var stories = xml.XDeserialise<HeadlineStoriesResponse>();
stories.IsSuccess = true;
return stories;
}
通常被测对象在测试时不会被mock。
创建被测对象的实例并注入模拟依赖项。
//Arrange
//...
ICommonComponents<StoryProvider> common = GetCommonComponents<StoryProvider>();
var reports = Substitute.For<IEvalReports>();
var provider = new StoryProvider(common, reports);
//Act
var actual = await provider.HeadlineNewsContentAsync(request);
//Assert
//...
我声明了以下 class 和构造函数:
public class StoryProvider : ReportProviderBase<StoryProvider>, IStoryProvider
{
public StoryProvider(ICommonComponents<StoryProvider> common)
: base(common)
{
Common.Logger.LogTrace("Instantiating StoryProvider");
}
public StoryProvider(ICommonComponents<StoryProvider> common, IEvalReports reports)
: base(common)
{
Reports = reports;
Common.Logger.LogTrace("Instantiating StoryProvider");
}……
基础class有如下声明:
public abstract class ReportProviderBase<T> : IDisposable
where T : class
{
public IEvalReports Reports { get; set; }
protected ICommonComponents<T> Common { get; }
protected ReportProviderBase(ICommonComponents<T> common)
{
Common = common;
CreateProfileServerComInstance();
}…..
使用 Nsubstitute 我声明:
ICommonComponents<StoryProvider> common = GetCommonComponents<StoryProvider>();
var reports = Substitute.For<IEvalReports>();
现在如果我调用我的测试方法:
var provider = await Substitute.For<StoryProvider>(common).HeadlineNewsContentAsync(request);
它在 HeadlineNewsContentAsync
中失败,因为 Reports 尚未实例化。
我真的很想用我重载的构造函数调用它:
var provider = await Substitute.For<StoryProvider>(common, reports).HeadlineNewsContentAsync(request);
此时它只是崩溃并显示 TestInvoker.cs 未找到。很明显,我以错误的方式附加了 reports
,我应该如何更改对此方法的调用,以便它使用我重载的构造函数
下面是被测函数:
public HeadlineStoriesResponse HeadlineNewsContent(FrontPageContentRequest request)
{
EnsureConnectedToProfileServer(request.SessionId);
var requestXml = request.XSerialise();
var success = Reports.FrontPageOperation(requestXml, out var responseXml);
if (!success || string.IsNullOrEmpty(responseXml) || responseXml.Contains("<FRONTPAGE_CONTENT/>"))
return new HeadlineStoriesResponse { IsSuccess = false };
var xml = responseXml.GetNodeFromXmlString("FRONTPAGE_CONTENT//HEADLINE_STORIES");
var stories = xml.XDeserialise<HeadlineStoriesResponse>();
stories.IsSuccess = true;
return stories;
}
通常被测对象在测试时不会被mock。
创建被测对象的实例并注入模拟依赖项。
//Arrange
//...
ICommonComponents<StoryProvider> common = GetCommonComponents<StoryProvider>();
var reports = Substitute.For<IEvalReports>();
var provider = new StoryProvider(common, reports);
//Act
var actual = await provider.HeadlineNewsContentAsync(request);
//Assert
//...