加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

实体框架 – 使用伪造的DbContext和Autofixture以及Moq进行测试

发布时间:2020-12-16 06:23:36 所属栏目:asp.Net 来源:网络整理
导读:所以请遵循这个例子 example和如何制作一个假的DBContex测试我的测试使用这个工作正常 [Test]public void CiudadIndex(){ var ciudades = new FakeDbSetCiudad { new Ciudad {CiudadId = 1,EmpresaId =1,Descripcion ="Santa Cruz",FechaProceso = DateTime.
所以请遵循这个例子

example和如何制作一个假的DBContex测试我的测试使用这个工作正常

[Test]
public void CiudadIndex()
{
    var ciudades = new FakeDbSet<Ciudad>
    {
        new Ciudad {CiudadId = 1,EmpresaId =1,Descripcion ="Santa Cruz",FechaProceso = DateTime.Now,MarcaBaja = null,UsuarioId = 1},new Ciudad {CiudadId = 2,Descripcion ="La Paz",new Ciudad {CiudadId = 3,Descripcion ="Cochabamba",UsuarioId = 1}
    };

    //// Create mock unit of work
    var mockData = new Mock<IContext>();
    mockData.Setup(m => m.Ciudades).Returns(ciudades);

    // Setup controller
    var homeController = new CiudadController(mockData.Object);

    // Invoke
    var viewResult = homeController.Index();
    var ciudades_de_la_vista = (IEnumerable<Ciudad>)viewResult.Model;

    // Assert..
}

Iam现在尝试使用Autofixture-Moq

创造“ciudades”,但我不能.我试试这个

var fixture = new Fixture();
var ciudades = fixture.Build<FakeDbSet<Ciudad>>().CreateMany<FakeDbSet<Ciudad>>();
var mockData = new Mock<IContext>();
mockData.Setup(m => m.Ciudades).Returns(ciudades);

我收到这个错误

Cant convert System.Collections.Generic.IEnumerable(FakeDbSet(Ciudad)) to System.Data.Entity.IDbSet(Ciudad)

不能把“<>”所以我在错误消息中用“()”替换

IContext和FakeDbSet的实现

public interface IContext
{
    IDbSet<Ciudad> Ciudades { get; }
}
public class FakeDbSet<T> : IDbSet<T> where T : class

怎么能让这个工作?

解决方法

一个小问题……在以下方面:

var ciudades_fixture = fixture.Build<Ciudad>().CreateMany<Ciudad>();

第二种类型arg是不必要的,应该是:

var ciudades_fixture = fixture.Build<Ciudad>().CreateMany();

我真的明白为什么你需要一个FakeDbSet而且这篇文章有点TL; DR …一般来说,我试图避免伪造和混淆ORM位,而是处理可能最大程度地返回POCO的接口.

除此之外……初始化列表的正常语法工作原因是DBFixture中有Add(和IEnumerable). AutoFixture直接没有关于该模式的故事(毕竟它是编译器语法糖,并不特别适合反射或符合任何其他约定)但只要存在ICollection,您就可以使用AddManyTo.幸运的是,在文章中FakeDbSet的内容中,以下内容为我们提供了一个:

public ObservableCollection<T> Local
{
    get { return _data; }
}

作为ObservableCollection< T>从ICollection< T>派生,您应该能够:

var ciudades = new FakeDbSet<Cuidad>();
fixture.AddManyTo(ciudades.Local);

var mockData = new Mock<IContext>();
mockData.Setup(m => m.Ciudades).Returns(ciudades);

可以连接自定义以使其更漂亮,但至少您有办法管理它.另一种选择是让某些东西实现ICollection(或者使用设置器获取IEnumerable< T>并让AF生成父对象,使得所述集合被填充).

长期取代的旁注:在您的初始问题中,您实际上有:

fixture.Build<FakeDbSet<Ciudad>>().CreateMany()

问题变得更加清晰了 – 你要求AF生成许多FakeDbSet< Ciudad> s,这不是你想要的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读