Gallio/MbUnit有一個contract verifier這正是你正在尋找。的AccessContract的典型用法如下:
public class Foo // Dummy reference type.
{
private readonly int value;
public int Value { get { return value; } }
public Foo (int value)
{
this.value = value;
}
}
public class Bar
{
private Foo foo;
public Bar(string unusedParameter) { }
public Foo Foo // A complex property to be tested!
{
get { return foo; }
set
{
if (value == null)
throw new ArgumentNullException("value");
if (value.Value < 0)
throw new ArgumentOutOfRangeException();
if (value.Value == 666)
throw new ArgumentException("Inferno value strictly forbidden.");
foo = value;
}
}
}
和使用AccessorContract運行對房地產各種測試的測試夾具。
[TestFixture]
public class BarTest
{
[VerifyContract]
public readonly IContract AccessorTests = new AccessorContract<Bar, Foo>
{
Getter = target => target.Foo,
Setter = (target, value) => target.Foo = value,
ValidValues = { new Foo(123), new Foo(456), new Foo(789) },
AcceptNullValue = false,
DefaultInstance =() => new Bar("Hello"),
InvalidValues =
{
{ typeof(ArgumentOutOfRangeException), new Foo(-123), new Foo(-456) },
{ typeof(ArgumentException), new Foo(666) }
}
};
}
合同驗證生成以下的單元測試:
看一看的MbUnit test project更多應用實例。
你檢查過pex和痣嗎? - http://research.microsoft.com/en-us/projects/pex/ – luketorjussen
@Luke我曾與PEX玩過,但還沒有時間徹底使用它 –
不會間接測試它們的測試嗎?屬性作爲其執行的一部分,捕捉這些錯誤?你真的需要更多的測試嗎? – Gishu