1

我有以下代码:

public class FakeOrderRepository:IOrderRepository
{

    private static Fixture fixture = new Fixture();

    private List<acc_ORDERS> dbmock = new List<acc_ORDERS>()
                                          {
                                              fixture.Build<acc_ORDERS>().With(x => x.OrderNumber,Tests.FAKE_ORDERNUMBER)
                                              .Without(x => x.EntityKey)
                                              .Without(x => x.usr_CUSTOMERSReference)
                                              .Without(x => x.usr_CUSTOMERS)
                                              .Without(x => x.sys_COUNTRY1Reference)
                                              .Without(x => x.sys_COUNTRYReference)
                                              .Without(x => x.sys_STATE1Reference)
                                              .Without(x => x.sys_STATEReference)
                                              .Without(x => x.acc_CUSTOMJEWEL_ORDER_ITEMS)
                                              .Without(x => x.acc_DIAMOND_ORDER_ITEMS)
                                              .Without(x => x.acc_JEWELRY_ORDER_ITEMS)
                                              .Without(x => x.acc_CASHFLOW)
                                              .Without(x => x.sys_STATE)
                                              .Without(x => x.sys_STATE1)
                                              .Without(x => x.sys_COUNTRY)
                                              .Without(x => x.sys_COUNTRY1)

                                              .CreateAnonymous()
                                          };



    public int Save(Order orderdto)
    {
        throw new NotImplementedException();
    }

    public Order GetOrderByOrderNumber(int orderNumber)
    {
        try
        {
            var orderdto = dbmock.Where(x => x.OrderNumber == orderNumber).SingleOrDefault();
            orderdto.sys_COUNTRYReference= new EntityReference<sys_COUNTRY>()
                                               {
                                                   Value = new sys_COUNTRY()
                                               };

            var order = Mapper.Map<acc_ORDERS, Order>(orderdto);

            return order;

        }
        catch (Exception ex)
        {

            throw new Exception("when asked to get the order with the ordernumber:" + orderNumber + " an error occured\r\n" + ex.Message);
        }



    }
}

看起来像这一行:

orderdto.sys_COUNTRYReference= new EntityReference<sys_COUNTRY>()
                                               {
                                                   Value = new sys_COUNTRY()
                                               };

当执行导致异常时,我试图模拟引用对象,如果我在没有这个的情况下调用代码,一切正常,但我的测试代码需要 sys_COUNTRYReference 对象。

例外:

当此 RelatedEnd 的所有者为空时,不允许请求的操作。使用默认构造函数创建的 RelatedEnd 对象只能在序列化期间用作容器。

请就如何解决此问题或从不同角度进行攻击提出建议。

谢谢你。

4

1 回答 1

0

根据我的经验, AutoFixture 不适用于 EFEntityObject实体。原因是它想要分配对象的每个属性。是的,您可以使用 来告诉它跳过某些属性.Without(),但是当您只想“伪造”大约一半的属性时,这会变得非常乏味。您的示例代码只触及表面,并且已经模糊了测试的目的。

我无法找到阻止 AutoFixture 分配给某些类型的方法,尤其是开放的泛型类型。

所以我认为你不能为此使用 AutoFixture(但是!——它是开源的,有人可以提供修复......)。

另一方面,我不同意@Ladislav - 使用EntityObject实体进行测试可以正常工作。AutoFixture 似乎对此无动于衷,但这并不意味着您无法测试!你只需要直接用 AutoFixture 以外的东西分配测试值。

您当然可以按照以下方式做一些事情:

myEntity = new SomeEntity
{
    Foo = fixture.CreateAnonymous<string>(),
    Bar = fixture.CreateAnonymous<int>()
};

..ETC。

于 2011-09-19T13:17:38.097 回答