标题可能不好,这个问题可能很愚蠢,但是我真的不知道该怎么做。
我创建了一个项目,该项目使用EF Core连接到数据库。我已经创建了执行实际查询的DbContext类和Repository类。
然后我创建了另一个类,也许我创建了错误的类,但是使它类似于MVC项目的控制器。这是我的课程:
public class ExtractCustomersToBeMarked
{
private ICampaignRepository _repository;
private ILogger<ExtractCustomersToBeMarked> _logger;
public ExtractCustomersToBeMarked(ILogger<ExtractCustomersToBeMarked> logger, ICampaignRepository repository)
{
_repository = repository;
_logger = logger;
}
public async Task ExtractCustomers()
{
IEnumerable<CampaignKnownCustomers> result = _repository.getCustomersGUID();
... I want to debug this code
}
}
现在我要调试程序。我尝试从Main程序调用该方法,但没有成功,因为我不知道将什么传递给构造函数(MVC自行完成此操作)。那就是我尝试过的:
public static void Main(string[] args)
{
var p = new Program();
p.Run().Wait();
}
private async Task Run()
{
ExtractCustomersToBeMarked ectm = new ExtractCustomersToBeMarked(?,?);
await ExtractCustomersToBeMarked.ExtractCustomers();
}
我知道它看起来并不好,该结构仅用于调试。如果还有其他方法,我愿意听一听。
如何在ExtractCustomers
上调试器?
答案 0 :(得分:1)
我想您已经实现了CampaignRepository
类。假设您要在调试ExtractCustomers()
方法时使用此实现,则只需创建该方法的一个实例并将其传递给该方法:
static void Main(string[] args)
{
ExtractCustomersToBeMarked ectm = new ExtractCustomersToBeMarked(null, new CampaignRepository());
ectm.ExtractCustomers().Wait();
}
记录器也是如此。如果在要调试的方法中使用记录器,则创建一个实现ILogger<ExtractCustomersToBeMarked>
的类的实例。创建实例时,不要忘记将其传递给ExtractCustomersToBeMarked
类的构造函数。
尽管您可能想实施集成测试,而不是修改应用程序本身的Main()
方法,但这是另一回事。
答案 1 :(得分:0)
摘要,建议您针对要调试的代码编写单元测试。
详细信息当您完成单元测试时,可以在Debug下运行每个测试,从而使您可以完全像调试应用程序时一样逐步遍历代码。但是有了定义测试范围和上下文的好处,例如,您可以独立于系统的其他部分来测试系统。
一旦测试到位,它可以缩短代码+调试迭代周期所花费的时间,从而使您的工作效率更高。之所以能够实现这一目标,是因为该测试将您直接触发到已经设置了测试场景的相关代码中,而不是整个应用程序都必须启动,并且您每次都导航至相关部分以进入所需的场景。 / p>
这些测试的另一个好处是(如果编写方式正确)可以使它们作为自动构建的一部分运行,只要有人更改某些代码,该构建就会触发。这意味着,如果有人破坏了该代码,则测试将失败,并且构建也将失败。