簡體   English   中英

如何編寫nUnit / Moq來測試通用擴展方法?

[英]How to write nUnit/Moq for testing generic extension methods?

我有以下通用擴展方法從ObjectContext中刪除所有EntityObjects

public static void DeleleAllObjects<TEntity>(this ObjectContext context)
        where TEntity : EntityObject
    {
        var objectSet = context.CreateObjectSet<TEntity>();
        objectSet.ToList().ForEach(e => objectSet.DeleteObject(e));
    }

我是TDD並且使用nUnit / Moq的新手......但是我不知道在哪里為這個方法編寫測試?

我希望這有幫助:

[TestFixture]
public class ExtensionTest
{
    public class FakeEntity : EntityObject
    {

    }

    [Test]
    public void DeleteAllObjects()
    {
        //arrange
        var objectsToDelete = new List<FakeEntity>
            {
                new FakeEntity(),
                new FakeEntity()
            };
        var mockContext = new Mock<ObjectContext>();
        var mockObjectSet = new Mock<ObjectSet<FakeEntity>>();
        mockObjectSet.Setup(x => x.ToList()).Returns(objectsToDelete);
        mockContext.Setup(x => x.CreateObjectSet<FakeEntity>()).Returns(mockObjectSet.Object);

        //act
        mockContext.Object.DeleteAllObjects<FakeEntity>();

        //assert
        mockContext.Verify(x => x.CreateObjectSet<FakeEntity>(), Times.Once());
        mockObjectSet.Verify(x => x.ToList(), Times.Once());
        mockObjectSet.Verify(x => x.DeleteObject(It.IsAny<FakeEntity>()), Times.Exactly(2));

    }
}

現在,假設所有模擬類型(上下文和對象集)都將您調用的方法聲明為virtual或類是abstract 模擬接口通常限制性較小。

此外,如果你想對你的斷言更加挑剔,以確保首先使用第一個實例調用DeleteObject ,然后使用第二個實例調用,而不是第一個實例,那么你可以更改測試的那一部分。 但這應該是一個很好的起點。

總結一下:

此特定測試應該只測試擴展方法中的代碼。 意思是,它應該只確保調用CreateObjectSet<>() ,獲取列表,然后在每個上調用DeleteObject

它確實不在乎DeleteObject()確實改變了ObjectSet (事實上​​它不會,因為它是一個模擬)。 這應該是DeleteObject()方法測試的責任,但由於我假設這實際上是一個EF方法,所以不應該為第三方組件編寫測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM