【发布时间】:2017-08-07 19:25:43
【问题描述】:
我一直在努力将我的紧密耦合方法转换为可以进行单元测试的方法,并在此处寻求一些建议。多亏了一些建议,我现在让我的方法通过了它的单元测试——但是我现在发现我无法从我的应用程序中调用该方法。我曾经使用以下方法从控制器访问我的 GetAllProductsFromCSV() 方法:
public ActionResult Index()
{
var products = new ProductsCSV();
List<ProductItem> allProducts = products.GetAllProductsFromCSV();
foreach (var product in allProducts)
{
if (string.IsNullOrEmpty(product.ImagePath))
{
product.ImagePath = "blank.jpg";
}
}
return View(allProducts);
}
方法如下:
public class ProductsCSV
{
public List<ProductItem> GetAllProductsFromCSV()
{
var productFilePath = HttpContext.Current.Server.MapPath(@"~/CSV/products.csv");
String[] csvData = File.ReadAllLines(productFilePath);
List<ProductItem> result = new List<ProductItem>();
foreach (string csvrow in csvData)
{
var fields = csvrow.Split(',');
ProductItem prod = new ProductItem()
{
ID = Convert.ToInt32(fields[0]),
Description = fields[1],
Item = fields[2][0],
Price = Convert.ToDecimal(fields[3]),
ImagePath = fields[4],
Barcode = fields[5]
};
result.Add(prod);
}
return result;
}
}
我现在对 ProductCSV 类进行了以下更改:
public class ProductsCSV
{
private readonly IProductsCsvReader reader;
public ProductsCSV(IProductsCsvReader reader = null)
{
this.reader = reader;
}
public List<ProductItem> GetAllProductsFromCSV()
{
var productFilePath = @"~/CSV/products.csv";
var csvData = reader.ReadAllLines(productFilePath);
var result = parseProducts(csvData);
return result;
}
private List<ProductItem> parseProducts(String[] csvData)
{
List<ProductItem> result = new List<ProductItem>();
foreach (string csvrow in csvData)
{
var fields = csvrow.Split(',');
ProductItem prod = new ProductItem()
{
ID = Convert.ToInt32(fields[0]),
Description = fields[1],
Item = fields[2][0],
Price = Convert.ToDecimal(fields[3]),
ImagePath = fields[4],
Barcode = fields[5]
};
result.Add(prod);
}
return result;
}
以及以下类和接口:
public class DefaultProductsCsvReader : IProductsCsvReader
{
public string[] ReadAllLines(string virtualPath)
{
var productFilePath = HostingEnvironment.MapPath(virtualPath);
String[] csvData = File.ReadAllLines(productFilePath);
return csvData;
}
}
public interface IProductsCsvReader
{
string[] ReadAllLines(string virtualPath);
}
正如我所说,GetAllProductsFromCSV 方法上的单元测试现在已成功完成,但是当我尝试从控制器访问该方法时,我在 GetAllProductsFromCSV 中的 reader.ReadAllLines 调用上收到 NullReferenceException。对我来说,当我尝试从控制器中创建 ProductsCSV 的实例时,我没有传递任何参数……但是该类的构造函数请求 IProductsCsvReader。我想不通的是我现在如何实际调用该方法?我希望这很清楚??
【问题讨论】:
-
你在哪里注册你的接口和具体实现?看起来那部分不起作用
标签: c# asp.net-mvc unit-testing dependency-injection