代码之家  ›  专栏  ›  技术社区  ›  bilpor

当我试图存根重载构造函数时,NSubstitute崩溃

  •  1
  • bilpor  · 技术社区  · 7 年前

    我声明了以下类和构造函数:

     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");
        }……
    

    基类具有以下声明:

     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 因为报表尚未实例化。

    我真的想使用重载构造函数调用它:

    var provider = await Substitute.For<StoryProvider>(common, reports).HeadlineNewsContentAsync(request);
    

    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;
        }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Nkosi    7 年前

    通常,测试对象在测试时不会被模仿。

    创建受测主题的实例并注入模拟依赖项。

    //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
    //...