2012-12-20 50 views
4

我已经从一个ObjectContext的如何编写用于测试通用扩展方法的nUnit/Moq?

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

删除所有EntityObjects以下通用扩展方法,我是相当新的TDD和使用NUnit /起订量...但我不知道哪里是编写测试对于这种方法?

+0

我想你已经先创建[TestFixtureSetup]创建上下文对象,以objectsets的预定数量。然后在这个函数调用后,你可以断言objectset.count为0.希望这会有所帮助。 – Mullaly

回答

5

我希望这有助于:

[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方法,因此您不应该为第三方组件编写测试。

+0

'非虚拟(VB中重写)成员的无效设置:'上CreateObjectSet ......这就是非虚:( – BlueChippy

+1

我明白了,那么,在这种情况下,你最好的选择可能是从上下文中提取的接口和你的扩展方法应用到界面,在这里看到更多的信息: http://stackoverflow.com/a/1894066/1373170 和这里:http://blog.voltje.be/2012/11/19 /使用-的ObjectContext和数据库先嘲讽实体框架-/ 或者如果你是第一次使用EF代码:http://romiller.com/2012/02/14/testing-with-a-fake-dbcontext/ –

+0

嗯......不知道我想创建一个存储库JUST,所以我可以创建一个可以测试的单一方法?在测试中添加本地数据库到测试项目并添加/删除项目可能会更简单吗? – BlueChippy