我正在尝试再次升级到AutoFixture 2,我遇到了对象上的数据注释问题。这是一个示例对象:
public class Bleh
{
[StringLength(255)]
public string Foo { get; set; }
public string Bar { get; set; }
}
我正在尝试创建匿名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 ?!
}
根据Bonus Bits,从2.4.0开始应该支持StringLength
,但即使它不受支持,我也不会期望一个空字符串。我正在使用NuGet的v2.7.1。我是否错过了创建数据注释对象所需的某种自定义或行为?
答案 0 :(得分:7)
感谢你报告这个!
此行为是设计原因(其原因基本上是属性本身的描述)。
通过在数据字段上应用[StringLength(255)],它基本上意味着允许最多包含0个字符。
根据msdn上的描述,StringLengthAttribute类:
指定数据中允许的最大字符长度 领域。 [.NET Framework 3.5]
指定最小和最大字符长度 允许在数据字段中。 [.NET Framework 4]
当前版本(2.7.1)基于.NET Framework 3.5构建。从2.4.0开始支持StringLengthAttribute类。
话虽如此,创建的实例是有效的(只是第二个断言语句不是)。
这是一个传递测试,它使用System.ComponentModel.DataAnnotations命名空间中的Validator类来验证创建的实例:
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using NUnit.Framework;
using Ploeh.AutoFixture;
public class Tests
{
[Test]
public void GetAll_HasContacts()
{
var fixture = new Fixture();
var bleh = fixture.CreateAnonymous<Bleh>();
var context = new ValidationContext(bleh, serviceProvider: null, items: null);
// A collection to hold each failed validation.
var results = new List<ValidationResult>();
// Returns true if the object validates; otherwise, false.
var succeed = Validator.TryValidateObject(bleh, context,
results, validateAllProperties: true);
Assert.That(succeed, Is.True); // pass
Assert.That(results, Is.Empty); // pass
}
public class Bleh
{
[StringLength(255)]
public string Foo { get; set; }
public string Bar { get; set; }
}
}
更新1 :
虽然创建的实例有效,但我相信这可以调整为在范围内选择一个随机数(0 - maximumLength),这样用户就不会得到一个空字符串。
我还在论坛上发起了一次讨论here。
更新2 :
如果您升级到AutoFixture版本2.7.2(或更新版本),原始测试用例现在将通过。
[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); // pass (version 2.7.2 or newer)
}