我如何模拟使用Moq为这个c#代码进行的以下DBContext调用?



在使用c#编写的服务文件中遇到下面一行时,我在使用Moq运行单元测试时面临一个问题。关于如何模拟这个特定调用的任何有价值的输入都将在这里受到欢迎。谢谢。这里的_context是DBContext的实例。

var dataObj = _context。FromSqlNotRequired(查询,commandParameters) .rows;

单元测试设置:

private readonly Mock<P4IDBContext> _mockContext;
private readonly Mock<DbSet<MetricsCalibrated>> _metricsCalibratedMockSet;
private readonly Mock<DbSet<FilterResult>> _filterMockSet;   
private readonly MetricsService _metricsService;
private readonly Mock<IMetricsService> metricsService;
private readonly Mock<Dictionary<String, String>> _dictionary;
private readonly SourceDataController controller;
//[Fact()]
public MetricsServiceTests()
{
metricsService = new Mock<IMetricsService>();

controller = new SourceDataController(metricsService.Object);
_metricsCalibratedMockSet = new Mock<DbSet<MetricsCalibrated>>();
_metricsCalibratedMockSet.Setup(m => m.AsQueryable()).Returns(_metricsCalibratedData);
_dictionary = new Mock<Dictionary<String, String>>();
_filterMockSet = new Mock<DbSet<FilterResult>>();
_filterMockSet.Setup(m => m.AsQueryable()).Returns(_filterData);
var commandParameters = new Dictionary<string, string>();
_mockContext = new Mock<P4IDBContext>();

_mockContext.Setup(m => m.MetricsCalibrated).Returns(_metricsCalibratedMockSet.Object);
_mockContext.Setup(m => m.FilterResult).Returns(_filterMockSet.Object);
_metricsService = new MetricsService(_mockContext.Object);
}

错误-消息:

Message: 
System.NullReferenceException : Object reference not set to an instance of an object.
Stack Trace: 
RelationalDatabaseFacadeExtensions.GetFacadeDependencies(DatabaseFacade databaseFacade)
RelationalDatabaseFacadeExtensions.GetDbConnection(DatabaseFacade databaseFacade)
DbContextExtensions.FromSqlNotRequired[T](DbContext context, String strSQL, Dictionary`2 commandParameters) line 24
MetricsService.GetBasicData(String wherePart, IDictionary`2 selectedDict, String timeInterval, Dictionary`2 commandParameters, String tillDate) line 242
MetricsService.GetFilteredData(FilterOptions options) line 64
MetricsServiceTests.TestGetFilteredData() line 63

[Fact]
public void Test()
{ 
//Below is the setup part. 
//given  
var metricsCalibratedData = new List<MetricsCalibrated>
{
new MetricsCalibrated{ /* ... */ }, /// fill sample data
new MetricsCalibrated{ /* ... */ }
}.AsQueryable();
var mockMetricsCalibratedSet = new Mock<DbSet<MetricsCalibrated>>();
mockMetricsCalibratedSet .As<IQueryable<MetricsCalibrated>>().Setup(m => m.Provider).Returns(metricsCalibratedData.Provider);
mockMetricsCalibratedSet .As<IQueryable<MetricsCalibrated>>().Setup(m => m.Expression).Returns(metricsCalibratedData.Expression);
mockMetricsCalibratedSet .As<IQueryable<MetricsCalibrated>>().Setup(m => m.ElementType).Returns(metricsCalibratedData.ElementType);
mockMetricsCalibratedSet .As<IQueryable<MetricsCalibrated>>().Setup(m => m.GetEnumerator()).Returns(metricsCalibratedData.GetEnumerator());
var filterResultData = new List<FilterResult>
{
new FilterResult{ /* ... */ },
new FilterResult{ /* ... */}
}.AsQueryable();
var mockFilterResultSet = new Mock<DbSet<FilterResult>>();
mockFilterResultSet.As<IQueryable<FilterResult>>().Setup(m => m.Provider).Returns(filterResultData .Provider);
mockFilterResultSet.As<IQueryable<FilterResult>>().Setup(m => m.Expression).Returns(filterResultData .Expression);
mockFilterResultSet.As<IQueryable<FilterResult>>().Setup(m => m.ElementType).Returns(filterResultData .ElementType);
mockFilterResultSet.As<IQueryable<FilterResult>>().Setup(m => m.GetEnumerator()).Returns(filterResultData .GetEnumerator());
var mockContext = new Mock<P4IDBContext>();
mockContext.Setup(c => c.MetricsCalibrated).Returns(mockMetricsCalibratedSet.Object);
mockContext.Setup(c => c.FilterResult).Returns(mockFilterResultSet.Object);
var sut = new MetricsService(mockContext.Object);
// Now, the test can b run
var actualResult = sut.GetFilteredData(validFilterOptions);
// Then Assert... 

最新更新