当我尝试存根重载的构造函数时 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
//...