Moq a Class 并且仍然使用它的方法
Moq a Class and Still use its Methods
我正在使用 Moq 框架模拟 class。但是,我无法获取或调用 Class 的方法。我将如何在下面的单元测试中解决这个问题?尝试编译程序以提取 class 中 Moq 中的方法。错误如下所列。
Class:
using System;
using ElectronicsStore.Models;
using Microsoft.Extensions.Logging;
namespace ElectronicsStore.Service
{
public class ParseVendorSupply
{
private readonly ILogger _logger;
public ParseVendorSupply(ILogger logger)
{
_logger = logger;
}
public VendorSupply FromCsv(string csvLine)
{
VendorSupply vendorsupply = new VendorSupply();
try
{
string[] values = csvLine.Split(',');
if (values.Length > 3)
{
throw new System.ArgumentException("Too much data");
}
vendorsupply.VendorId = Convert.ToInt16(values[0]);
vendorsupply.ProductId = Convert.ToInt16(values[1]);
vendorsupply.Quantity = Convert.ToInt16(values[2]);
}
catch (Exception)
{
_logger.LogInformation("An exception was thrown attempting");
}
return vendorsupply;
}
}
}
public Startup(IConfiguration configuration, ILogger<Startup> logger)
{
Configuration = configuration;
_logger = logger;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton(new LoggerFactory().AddConsole().AddDebug());
services.AddLogging();
N单元测试:
public class ParseVendorSupplyNunit
{
[Test]
public void FromCsv_ParseCorrectly_Extradata()
{
var logger = new Mock<ILogger>();
Mock<ParseVendorSupply> parseVendorSupplytest = new Mock<ParseVendorSupply>(logger);
var test = new Mock<ParseVendorSupply>(logger);
string csvLineTest = "5,8,3,9,5";
parseVendorSupplytest.FromCsv
// Receive error: Mock<ParseVendorSupply>' does not contain a definition for 'FromCsv' and no accessible extension method 'FromCsv' accepting a first argument of type 'Mock<ParseVendorSupply>' could be found (are you missing a using directive or an assembly reference?)
}
Moq 通过 .Object
属性 公开模拟对象。所以在你的情况下,你可以这样做:
parseVendorSupplytest.Object.FromCsv(csvLineTest);
话虽如此。我不确定这是你首先想要做的。假设您正在尝试使用模拟记录器测试 ParseVendorSupply
,我相信您的代码应该如下所示:
[Test]
public void FromCsv_ParseCorrectly_Extradata()
{
var logger = new Mock<ILogger>();
var parseVendorSupply = new ParseVendorSupply(logger.Object);
string csvLineTest = "5,8,3,9,5";
var result = parseVendorSupplytest.FromCsv(csvLineTest);
// Add your assertions here
}
另请注意,如果不需要任何设置,您可以使用 Mock.Of<T>()
快捷方式直接检索模拟对象:
var parseVendorSupply = new ParseVendorSupply(Mock.Of<ILogger>());
我正在使用 Moq 框架模拟 class。但是,我无法获取或调用 Class 的方法。我将如何在下面的单元测试中解决这个问题?尝试编译程序以提取 class 中 Moq 中的方法。错误如下所列。
Class:
using System;
using ElectronicsStore.Models;
using Microsoft.Extensions.Logging;
namespace ElectronicsStore.Service
{
public class ParseVendorSupply
{
private readonly ILogger _logger;
public ParseVendorSupply(ILogger logger)
{
_logger = logger;
}
public VendorSupply FromCsv(string csvLine)
{
VendorSupply vendorsupply = new VendorSupply();
try
{
string[] values = csvLine.Split(',');
if (values.Length > 3)
{
throw new System.ArgumentException("Too much data");
}
vendorsupply.VendorId = Convert.ToInt16(values[0]);
vendorsupply.ProductId = Convert.ToInt16(values[1]);
vendorsupply.Quantity = Convert.ToInt16(values[2]);
}
catch (Exception)
{
_logger.LogInformation("An exception was thrown attempting");
}
return vendorsupply;
}
}
}
public Startup(IConfiguration configuration, ILogger<Startup> logger)
{
Configuration = configuration;
_logger = logger;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton(new LoggerFactory().AddConsole().AddDebug());
services.AddLogging();
N单元测试:
public class ParseVendorSupplyNunit
{
[Test]
public void FromCsv_ParseCorrectly_Extradata()
{
var logger = new Mock<ILogger>();
Mock<ParseVendorSupply> parseVendorSupplytest = new Mock<ParseVendorSupply>(logger);
var test = new Mock<ParseVendorSupply>(logger);
string csvLineTest = "5,8,3,9,5";
parseVendorSupplytest.FromCsv
// Receive error: Mock<ParseVendorSupply>' does not contain a definition for 'FromCsv' and no accessible extension method 'FromCsv' accepting a first argument of type 'Mock<ParseVendorSupply>' could be found (are you missing a using directive or an assembly reference?)
}
Moq 通过 .Object
属性 公开模拟对象。所以在你的情况下,你可以这样做:
parseVendorSupplytest.Object.FromCsv(csvLineTest);
话虽如此。我不确定这是你首先想要做的。假设您正在尝试使用模拟记录器测试 ParseVendorSupply
,我相信您的代码应该如下所示:
[Test]
public void FromCsv_ParseCorrectly_Extradata()
{
var logger = new Mock<ILogger>();
var parseVendorSupply = new ParseVendorSupply(logger.Object);
string csvLineTest = "5,8,3,9,5";
var result = parseVendorSupplytest.FromCsv(csvLineTest);
// Add your assertions here
}
另请注意,如果不需要任何设置,您可以使用 Mock.Of<T>()
快捷方式直接检索模拟对象:
var parseVendorSupply = new ParseVendorSupply(Mock.Of<ILogger>());