如何使用 C#、MOQ 和 XUnit 将测试数据初始化为模拟上下文?
How do I initialize test data to mock context using C#, MOQ and XUnit?
我在 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 行计数。
这不是您通常使用模拟的方式。在 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();
}
我在 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 行计数。
这不是您通常使用模拟的方式。在 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();
}