C#如何在调试中找到方法

时间:2018-08-08 14:51:21

标签: c# asp.net-core

标题可能不好,这个问题可能很愚蠢,但是我真的不知道该怎么做。

我创建了一个项目,该项目使用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上调试器?

2 个答案:

答案 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>

这些测试的另一个好处是(如果编写方式正确)可以使它们作为自动构建的一部分运行,只要有人更改某些代码,该构建就会触发。这意味着,如果有人破坏了该代码,则测试将失败,并且构建也将失败。