测试Exchange Web服务API的最佳策略

Ada*_*ger 6 c# unit-testing mocking exchangewebservices

我正在开发一个新的C#3.5应用程序,它需要监视Exchange邮箱并在收到电子邮件时执行某些操作.我知道Microsoft现在建议使用Exchange Web服务在Exchange服务器上执行操作,因此我决定使用它.

我还发现了Exchange Web服务托管API(使用版本1.2.1),这似乎使得调用这些Web服务的任务变得更加容易.

我的问题是,有没有人有使用Managed API创建自动化单元/集成测试的经验?

目前我没有Exchange服务器所以我真的想创建某种模拟(我通常使用Moq)但是Microsoft.Exchange.WebServices.Data.ExchangeService没有实现任何我可以模拟的接口.我的代码全部编码为接口并设计用于依赖注入,但我想不出一个抽象出EWS API依赖的好方法.

Jak*_*sen 5

您可以使用Facade设计模式并在EWS托管API之上构建一组类.Facade类应该实现您自己创建的一组接口.接口不应模仿EWS API,只能在应用程序中公开所需的功能.

您的应用程序中的代码将很高兴忘记EWS.它只会知道您的Facade接口,这使您可以在单元测试时使用Moq存根或模拟接口.

例如,如果需要检索邮箱中的所有项目,可以使用名为GetItems的单个方法创建IMailBox接口:

public interface IMailBox
{
    IEnumerable<MailItem> GetItems(string smtpAddress, WellknownFolderName folder);
}
Run Code Online (Sandbox Code Playgroud)

对于您的应用程序,您将创建一个实现此接口的类.您可以使用您喜欢的DI框架在您的代码中注入该类.

public class MailBox : IMailBox
{
    public IEnumerable<MailItem> GetItems(string smtpAddress, WellknownFolderName folder)
    {
        var service = new ExchangeService();
        // Some code here...
    }
}
Run Code Online (Sandbox Code Playgroud)