4

所以按照这个例子

示例以及如何制作一个假的 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, EmpresaId =1, Descripcion ="La Paz", FechaProceso = DateTime.Now, MarcaBaja = null, UsuarioId = 1},
        new Ciudad {CiudadId = 3, EmpresaId =1, Descripcion ="Cochabamba", FechaProceso = DateTime.Now, MarcaBaja = null, 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..
}

我现在尝试使用 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);

我收到这个错误

无法将 System.Collections.Generic.IEnumerable(FakeDbSet(Ciudad)) 转换为 System.Data.Entity.IDbSet(Ciudad)

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

IContext 和 FakeDbSet 的实现

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

怎样才能使它起作用?

4

3 回答 3

3

一个小问题......在类似的东西中:

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

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

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

我真的理解你为什么需要 aFakeDbSet并且这篇文章有点 TL;DR... 一般来说,我尽量避免使用 ORM 位进行伪装和弄虚作假,而是尽可能处理返回 POCO 的接口。

除此之外......初始化列表的正常语法起作用的原因是DBFixture中有一个Add(和IEnumerable)。AutoFixture 没有直接针对该模式的故事(毕竟它是编译器语法糖,不是特别适合反射或符合任何其他约定),但AddManyTo只要有一个ICollection在发挥作用,您就可以使用。幸运的是,在文章中的 impl 中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 (或添加一个带有 setter的道具并让IEnumerable<T>AF 生成父对象,从而填充所述集合。


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

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

那么问题就变得更清楚了——你要求 AF 生成Many FakeDbSet<Ciudad> s,这不是你想要的。

于 2013-05-22T21:55:46.547 回答
1

我有一段时间没有使用 AutoFixture,但不应该是:

var ciudades = new FakeDbSet<Ciudad>();
fixture.AddManyTo(ciudades);
于 2013-05-22T17:34:29.393 回答
0

在我结束此操作的那一刻,我将继续阅读有关如何使用 automoq 的信息,因为我是这方面的新手

var fixture = new Fixture();
var ciudades_fixture = fixture.Build<Ciudad>().CreateMany<Ciudad>();
var ciudades = new FakeDbSet<Ciudad>();
foreach (var item in ciudades_fixture)
{
    ciudades.Add(item);
}
var mockData = new Mock<IContext>(); 
fixture.Create<Mock<IContext>>();
mockData.Setup(r => r.Ciudades).Returns(ciudades);
于 2013-05-22T19:34:22.423 回答