在使用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) 我有一个定制的自动混合构建器用于集成测试.代码如下.
问题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) 为了试图干掉我的单元测试,我试图使用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)
当然,如果我为项目中的每个特定控制器手动添加一个自定义,但是谁想要这样做呢?有没有更好的办法?
我写了以下自定义,并在大多数测试中将其作为复合的一部分应用.我的实体有一个只读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) 我正在将我的测试移植到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 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 .我是否错过了创建数据注释对象所需的某种自定义或行为?