2

私が書いている統合テストに問題があります。テスト中に追加した Outlook のカテゴリを (使用可能なカテゴリのリストから) 削除して、テストの最後にクリーンアップを実行する必要があります。「提出済み」カテゴリについては、次のようにします。

using Microsoft.Office.Interop.Outlook;

var outlookApplication = new Application();
outlookApplication.Session.Categories.Remove("Filed");

これはカテゴリの削除に失敗しますが、一貫性はありません。コードをデバッグすると機能しますが、テストを実行すると機能しません。

更新: すべてのテスト コードは次のとおりです。

[TestFixture]
public class BootstrapperTest
{
    private bool containsFiled;
    private bool containsPending;
    private Application outlookApplication = new Application();

    [Test]
    public void CanCreateFiledCategory()
    {
        var bootstrapper = new Bootstrapper();
        bootstrapper.LoadCategoriesIntoOutlook(outlookApplication); 
        var filedCategoryFound = outlookApplication.Session.Categories.Cast<Category>().Any(category => category.Name == "Filed");
        Assert.That(filedCategoryFound, Is.EqualTo(true));
    }

    [Test]
    public void CanCreatePendingCategory()
    {
        var bootstrapper = new Bootstrapper();
        bootstrapper.LoadCategoriesIntoOutlook(outlookApplication); 
        var pendingCategoryFound = outlookApplication.Session.Categories.Cast<Category>().Any(category => category.Name == "Pending");
        Assert.That(pendingCategoryFound, Is.EqualTo(true));
    }

    [SetUp]
    public void Setup()
    {
        containsFiled = DoesCategoryNameExist(outlookApplication.Session.Categories, "Filed");
        containsPending = DoesCategoryNameExist(outlookApplication.Session.Categories, "Pending");
    }

    [TearDown]
    public void TearDown()
    {
        RemoveAllCategoriesFromOutlook();
    }

    private bool DoesCategoryNameExist(Categories categoryList, string categoryName)
    {
        return categoryList.Cast<Category>().Any(category => category.Name == categoryName);
    }

    private void RemoveAllCategoriesFromOutlook()
    {
        var containsFiledNow = DoesCategoryNameExist(outlookApplication.Session.Categories, "Filed");
        var containsPendingNow = DoesCategoryNameExist(outlookApplication.Session.Categories, "Pending");
        if (!containsFiled && containsFiledNow) outlookApplication.Session.Categories.Remove("Filed");
        if (!containsPending && containsPendingNow) outlookApplication.Session.Categories.Remove("Pending");
    }
}

そして、それがテストしている方法:

public void LoadCategoriesIntoOutlook(Application outlookApplication)
{
    var categories = outlookApplication.Session.Categories;

    var filedCategoryNameExists = DoesCategoryNameAlreadyExist(categories, FiledCategoryName);
    var pendingCategoryNameExists = DoesCategoryNameAlreadyExist(categories, PendingCategoryName);
    var filedCategoryColourIsUsed = IsCategoryColorAlreadyUsed(categories, FiledCategoryColor);
    var pendingCategoryColourIsUsed = IsCategoryColorAlreadyUsed(categories, PendingCategoryColor);

    if (!filedCategoryNameExists)
    {
        if (filedCategoryColourIsUsed)
        {
            var categoryToBeChangedToFiled =
                    categories.Cast<Category>()
                              .Where(category => category.Color == FiledCategoryColor)
                              .FirstOrDefault();
            categoryToBeChangedToFiled.Name = FiledCategoryName;
        }
        else
        {
            categories.Add(FiledCategoryName, FiledCategoryColor);
        }
    }

    if (!pendingCategoryNameExists)
    {
        if (pendingCategoryColourIsUsed)
        {
            var categoryToBeChangedToPending =
                   categories.Cast<Category>()
                             .Where(category => category.Color == PendingCategoryColor)
                             .FirstOrDefault();
            categoryToBeChangedToPending.Name = PendingCategoryName;
        }
        else
        {
            categories.Add(PendingCategoryName, PendingCategoryColor);
        }
    }
}
4

1 に答える 1

1

非 DEBUG モードで実行したときに分岐条件にエラーがあるかどうかを確認するには、 が(経由でCategories.Remove)呼び出されたかどうかをログに記録する必要があります。確実に機能しますが、それはあなたの状態のエラーでなければなりません。その場合、ログ ステートメントは表示されません。Trace.TraceInformation()Categories.Remove

private void RemoveAllCategoriesFromOutlook()
{
        var containsFiledNow = DoesCategoryNameExist(outlookApplication.Session.Categories, "Filed");
        var containsPendingNow = DoesCategoryNameExist(outlookApplication.Session.Categories, "Pending");
        if (!containsFiled && containsFiledNow) 
        {
            outlookApplication.Session.Categories.Remove("Filed");
            Trace.TraceInformation("Deleted Filed Category!")
        }
        if (!containsPending && containsPendingNow) 
        {
            outlookApplication.Session.Categories.Remove("Pending");
            Trace.TraceInformation("Deleted Pending Category!")
        }
}

また、Categories色に基づいて作成するため (を参照filedCategoryColourIsUsed)、ではなく rename ()containsFiledを使用して作成した場合でも、FALSE が返される場合があります。あなたの問題は、テストフィクスチャ中にカテゴリの色を考慮しないことです。次のコードは、この問題を修正する必要があります...Category.Name = "Filed"Categories.Add()DoesCategoryNameExistSetupSetup()

[SetUp]
public void Setup()
{
    containsFiled = DoesCategoryNameExist(outlookApplication.Session.Categories, "Filed") || IsCategoryColorAlreadyUsed(categories, FiledCategoryColor);
    containsPending = DoesCategoryNameExist(outlookApplication.Session.Categories, "Pending") || IsCategoryColorAlreadyUsed(categories, PendingCategoryColor);
}
于 2012-06-26T13:35:22.700 に答える