问题描述
我在 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 行计数。
解决方法
这不是您通常使用模拟的方式。在模拟的 Object
属性上调用方法或属性在大多数情况下是错误的,因为这是对模拟本身的直接调用,不会向测试添加任何值。你想要的可能是这样的:
[Fact]
private void SetupMockData()
{
var data = TestData.MockFileProcessLogs();
mockDowJonesContext.Setup(x => x.FileProcessLogs).Returns(data);
mockDowJonesContext.Setup(x => x.SaveChanges());
// and then:
ingestService.DoSomeProcessing();
}