好的,将自己作为一个单独的 MailService 类来使用 Outlook 类(它本身就是一个单独的 afaik)似乎是个好主意。
一开始它工作得很好,但是当我尝试从我的 appservice 层为这个类设置单元测试(MS 单元测试)时,一切都崩溃了,我得到了 Runtime Callable Wrapper 错误。
我是否错误地将 MailService 类设置为单例类,或者我在将 Outlook 包装为单例类时做错了什么?
这是我的 Mailservice 类,其中显示了一种方法:
public class MailService : IDisposable
{
private static MailService _instance;
private Outlook.ApplicationClass _app;
private Outlook.NameSpace _olNS;
private MailService()
{
_app = new Outlook.ApplicationClass();
_olNS = _app.GetNamespace("MAPI");
}
public static MailService Instance
{
get
{
if (_instance == null)
_instance = new MailService();
return _instance;
}
}
public void Dispose()
{
_app.Quit();
Marshal.ReleaseComObject(_app);
GC.Collect();
GC.WaitForPendingFinalizers();
}
public Outlook.Folder getFolderByPath(string sFolderPath)
{
Outlook.Folder olFolder = null;
if (sFolderPath.StartsWith(@"\\"))
{
sFolderPath = sFolderPath.Remove(0, 2);
}
string[] sFolders = sFolderPath.Split('\\');
try
{
olFolder = _app.Session.Folders[sFolders[0]] as Outlook.Folder;
if (olFolder != null)
{
for (int i = 1; i <= sFolders.GetUpperBound(0); i++)
{
Outlook.Folders subFolders = olFolder.Folders;
olFolder = subFolders[sFolders[i]] as Outlook.Folder;
if (olFolder == null)
{
return null;
}
}
}
return olFolder;
}
catch (Exception e)
{
LogHelper.MyLogger.Error("Error retrieving " + sFolderPath, e);
return null;
}
}
}
我的 MS 单元测试是单独工作的,但不是在测试列表中运行全部时。在后一种情况下,只有第一个测试通过了......
[TestMethod]
public void TestMonitorForCleanUpDone()
{
Assert.IsNotNull(MailService.Instance.getFolderByPath(olFolderDone));
}
[TestMethod]
public void TestMonitorForCleanUpIn()
{
Assert.IsNotNull(MailService.Instance.getFolderByPath(olFolderIn));
}