【问题标题】:How do I initialize test data to mock context using C#, MOQ and XUnit?如何使用 C#、MOQ 和 XUnit 初始化测试数据以模拟上下文?
【发布时间】:2021-08-17 20:43:23
【问题描述】:

我在 C# .NET Core 3.1 中有此设置。

public class IngestServiceTest
{
    private Mock<IDowJonesContext> mockDowJonesContext;
    private ILogger<object> _logger;
    private readonly IngestService ingestService;

    public IngestServiceTest()
    {
        IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("appsettings.test.json").Build();
        _logger = LoggerFactory.Create(builder => builder.AddConsole()).CreateLogger<object>();

        mockDowJonesContext = new Mock<IDowJonesContext>();
        ingestService = new IngestService(mockDowJonesContext.Object, configuration, _logger);
    }

    [Fact]
    private void SetupMockData()
    {
        var data = TestData.MockFileProcessLogs();
        mockDowJonesContext.Object.FileProcessLogs.AddRange(data);
        mockDowJonesContext.Object.SaveChanges();
    }
}

但是在 mockDowJonesContext.Object.FileProcessLogs.AddRange(data);,它遇到错误System.NullReferenceException: 'Object reference not set to an instance of an object.'

我已经检查过了。 data 有 3 行计数。

【问题讨论】:

  • FileProcessLogs 为空。

标签: c# moq xunit


【解决方案1】:

这不是您通常使用模拟的方式。在大多数情况下,在 mock 的 Object 属性上调用方法或属性是错误的,因为这是对 mock 本身的直接调用,不会为测试添加任何值。你想要的可能是这样的:

    [Fact]
    private void SetupMockData()
    {
        var data = TestData.MockFileProcessLogs();
        mockDowJonesContext.Setup(x => x.FileProcessLogs).Returns(data);
        mockDowJonesContext.Setup(x => x.SaveChanges());
        // and then:
        ingestService.DoSomeProcessing();
    }

【讨论】:

  • 非常感谢。现在我的data 出错了。它说无法将列表转换为 Dbset。所以我的数据也必须是Dbset?是var data = new Mock&lt;DbSet&lt;FileProcessLog&gt;&gt;();吗?
  • 您的代码 sn-p 没有说明这些类型在哪里。这取决于。它可以是上面的,也可以只是DbSet&lt;FileProcessLog&gt;。因为它是数据,你通常不需要模拟它。
猜你喜欢
  • 1970-01-01
  • 2017-08-06
  • 2014-01-24
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
相关资源
最近更新 更多