相关疑难解决方法(0)

使用Autofixture将子实例上的属性值设置为固定值

在使用Autofixture构建父级时,是否可以为子实例上的属性分配固定值?它会将默认值添加到子实例上的所有属性(如charm),但我想覆盖并为子实例上的某个属性指定特定值.

鉴于这种父/子关系:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public Address Address { get; set; }
}

public class Address
{
    public string Street { get; set; }
    public int Number { get; set; }
    public string City { get; set; }
    public string PostalCode { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想在地址实例上为City属性分配一个特定值.我正在考虑这个测试代码:

var fixture = new Fixture();

var expectedCity = "foo";

var person = fixture
    .Build<Person>()
    .With(x => x.Address.City, expectedCity) …
Run Code Online (Sandbox Code Playgroud)

c# hierarchy autofixture

19
推荐指数
2
解决办法
5529
查看次数

使用种子属性自定义AutoFixture构建器

我有一个定制的自动混合构建器用于集成测试.代码如下.

问题1 -目前第一个事务有一个1 TransactionViewKey.TransactionId等如何设置TransactionViewKey TRANSACTIONID所以它是从方法PARAM播种beginningTransactionId?例如,返回第一个TransactionId为200的TransactionViews数组,然后每个递增1?

问题2 - 用于确定transactiondate的lambda似乎只运行一次 - 因此每个日期都是相同的值.如何设置构建器,以便为每个生成的实例运行随机日期生成器而不是仅运行一次?

谢谢

  static TransactionView[] CreateTransactions(int transactionsToReturnCount, long beginningTransactionId) {
      Random random = new Random();
      IFixture fixture = new Fixture();
      fixture.Customize<TransactionViewKey>(ob => ob
                                    .With(t => t.TransactionId)
                                    .With(t => t.TransactionIdSpecified, true)
                                    .OmitAutoProperties()
                                    );
      fixture.Customize<TransactionView>(ob => ob
                                             .With(t => t.TransactionDate, DateTime.Now - new TimeSpan(random.Next(30),0,0,0))
                                             .With(t => t.PostDate, DateTime.Now - new TimeSpan(random.Next(30), 0, 0, 0))
                                             .With(t => t.ViewKey)
                                             .With(t => t.Amount)
                                             .OmitAutoProperties()
          );
      IEnumerable<TransactionView> transactionViews = fixture.CreateMany<TransactionView>(transactionsToReturnCount);
      return transactionViews.OrderBy(t => t.TransactionDate).ToArray();
  }
Run Code Online (Sandbox Code Playgroud)

c# autofixture

16
推荐指数
1
解决办法
6639
查看次数

如何将AutoFixture自定义应用于从基类继承的任何内容?

为了试图干掉我的单元测试,我试图使用AutoFixture作为IoC容器来实例化我的被测系统(SUT),在这种特殊情况下是ASP.NET MVC Controller.因此,我想自定义AutoFixture以创建没有自动属性的控制器.

我尝试添加自定义ControllerBase,但它似乎不适用于子类ControllerBase.

fixture.Customize<ControllerBase>(c => c.OmitAutoProperties());
Run Code Online (Sandbox Code Playgroud)

这是我希望能够编写的测试示例:

    [Theory, AutoFixtureData]
    public void ControllerTest(AccountController controller) {
        Assert.Equal(default(UrlHelper), controller.Url);
    }
Run Code Online (Sandbox Code Playgroud)

当然,如果我为项目中的每个特定控制器手动添加一个自定义,但是谁想要这样做呢?有没有更好的办法?

c# unit-testing autofixture

7
推荐指数
1
解决办法
1364
查看次数

为什么AutoFixture Customization导致继承的属性无法填充?

我写了以下自定义,并在大多数测试中将其作为复合的一部分应用.我的实体有一个只读ID,但我在这个自定义中使用他们的SetId方法,以确保所有实体都有一些Id,如果它们是瞬态的(没有Id).

public class SetEntityIdCustomization : ICustomization {
    public void Customize(IFixture fixture) {
        var engine = ((Fixture)fixture).Engine;
        fixture.Customizations.Add(new Postprocessor(
            engine, o => {
                var entity = o as BaseEntity;
                if (entity == null || !entity.IsTransient()) {
                    return;
                }
                entity.SetId(fixture.CreateAnonymous<Guid>());
            }));
    }
}
Run Code Online (Sandbox Code Playgroud)

这一直很有效,直到今天我发现了一件非常奇怪的事情.如果我提供一个直接从BaseEntity继承的实体的测试,一切都很好,并且它的可写属性是自动填充的.但是,如果我要求从BaseEntity继承的实体继承,我的自定义会阻止属性自动填充.

正确填充此测试方法中的User实体:

public class User : BaseEntity {
    public string Email { get; set; }
    public int CoolThings { get; set; }
}

...
[Theory, AutoDomainData]
public void SomeTest(User user, ...) {
    // user.Email and user.CoolThings have auto-filled values, …
Run Code Online (Sandbox Code Playgroud)

unit-testing autofixture

7
推荐指数
1
解决办法
884
查看次数

AutoFixture 2使用()不能像在AutoFixture 1中那样工作吗?

我正在将我的测试移植到AutoFixture 2.0,并且我遇到了一些我无法解释或解决的奇怪行为.这个简单的测试对我失败了:

var autoFixtures = new Fixture();
var file = autoFixtures.Build<File>()
                       .With(f => f.Name, "bleh.txt")
                       .CreateAnonymous();

Assert.That(file.Name, Is.EqualTo("bleh.txt"));  // Fail?!
Run Code Online (Sandbox Code Playgroud)

如果我Name改为另一个属性,测试成功File,这导致我认为我有一些自定义存在,Name因为当我使用AutoFixture 1.0时,该工作无效.不过,我已经搜索过我的代码了,我找不到那样的东西.

启用跟踪似乎没有多大帮助.

autoFixtures.Behaviors.Add(new TracingBehavior());
Run Code Online (Sandbox Code Playgroud)

显示,以及其他东西:

Requested: System.String Name
    Requested: Ploeh.AutoFixture.Kernel.SeededRequest
    Created: Ploeh.AutoFixture.Kernel.NoSpecimen
  Requested: Ploeh.AutoFixture.Kernel.SeededRequest
    Requested: System.String
    Created: Ploeh.AutoFixture.Kernel.NoSpecimen
    Requested: System.String
    Created: 8a022fda-fa4e-49b7-b0c2-285fef765386
  Created: Name8a022fda-fa4e-49b7-b0c2-285fef765386
Created: Name8a022fda-fa4e-49b7-b0c2-285fef765386
Run Code Online (Sandbox Code Playgroud)

FWIW Name被声明为File基类的虚拟属性,然后被覆盖File:

public abstract class Item
{
    public virtual string Name { get; set; }
    ...
}

public class File …
Run Code Online (Sandbox Code Playgroud)

autofixture

4
推荐指数
1
解决办法
308
查看次数

为什么AutoFixture不能使用StringLength数据注释?

我正在尝试再次升级到AutoFixture 2,我遇到了对象上的数据注释问题.这是一个示例对象:

public class Bleh
{
    [StringLength(255)]
    public string Foo { get; set; }
    public string Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个匿名Bleh,但带有注释的属性将变为空,而不是使用匿名字符串填充.

[Test]
public void GetAll_HasContacts()
{
    var fix = new Fixture();
    var bleh = fix.CreateAnonymous<Bleh>();

    Assert.That(bleh.Bar, Is.Not.Empty);  // pass
    Assert.That(bleh.Foo, Is.Not.Empty);  // fail ?!
}
Run Code Online (Sandbox Code Playgroud)

根据Bonus Bits,StringLength应该从2.4.0开始支持,但即使它不受支持,我也不会期望一个空字符串.我正在使用NuGet的 v2.7.1 .我是否错过了创建数据注释对象所需的某种自定义或行为?

autofixture data-annotations

3
推荐指数
1
解决办法
847
查看次数