感谢您报告此事!
这种行为是设计使然(其原因基本上是属性本身的描述)。
通过在数据字段上应用 [StringLength(255)] 基本上意味着它允许有 0 到 255 个字符。
根据msdn上的描述,StringLengthAttribute类:
当前版本 (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)选择一个随机数,这样用户就永远不会得到一个空字符串。
我还在这里的论坛上创建了一个讨论。
更新 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)
}