Roo*_*ian 7 c# unit-testing autofixture
我想编写一个测试,检查给定命名空间中的类.如果它们返回null,则必须检查返回任何类型列表的类的所有方法.如果是这样,测试必须失败.
类/方法本身也有自动锁定的依赖项(构造函数参数和方法参数).
AutoFixture有一种机制来检查返回任何类型列表的方法永远不会返回null吗?
示例类:
public class UserService
{
private readonly IRemotingFacade _remotingFacade;
public UserService(IRemotingFacade remotingFacade)
{
_remotingFacade = remotingFacade;
}
// directly return a list
public IEnumerable<User> GetUsers()
{
}
// directly return a list, pass method parameters
public IEnumerable<User> GetUsers(string filter)
{
}
// wrapped list
public IBusinessResponse<IEnumerable<User>> GetUsers()
{
}
// wrapped list, pass method parameters
public IBusinessResponse<IEnumerable<User>> GetUsers(string filter)
{
}
}
Run Code Online (Sandbox Code Playgroud)
所以请说明列表可以包含在另一个对象中.
Ruben Bartelink上面的评论是正确的.令人惊讶的是,AutoFixture.Idioms还没有(还)有那个特定的测试,尽管引入该库的第一个惯用测试是它在命令端的等效测试:GuardClauseAssertion
但是,我认为这是一个很好的主意(我不知道为什么我之前没想过),所以我现在在积压中添加了一个新任务.
AutoFixture 3.18.0引入了一个名为Idioms.FsCheck的新胶水库,它使用FsCheck实现一个名为的可重用断言ReturnValueMustNotBeNullAssertion.
此新断言验证(或至少可能使得返回值(Query)的方法不返回null.
安装
Idioms.FsCheck在NuGet上可用:
PM> Install-Package AutoFixture.Idioms.FsCheck
Run Code Online (Sandbox Code Playgroud)
方案
的UserService使用的一个实例注入IRemotingFacade和公开两个[1]查询:
场景#1:注入的实例IRemotingFacade返回null:
[Theory, UnitTestConventions]
public void Scenario1(
ISpecimenBuilder builder,
[Frozen]Mock<IRemotingFacade> stub)
{
stub.Setup(x => x.GetUsers()).Returns((User[])null);
var sut = from x in new Methods<UserService>() select x.GetUsers();
var assertion = new ReturnValueMustNotBeNullAssertion(builder);
Assert.Throws<ReturnValueMustNotBeNullException>(() =>
assertion.Verify(sut));
}
Run Code Online (Sandbox Code Playgroud)
场景#2:注入的an实例IRemotingFacade不返回null:
[Theory, UnitTestConventions]
public void Scenario2(
ISpecimenBuilder builder,
[Frozen]Mock<IRemotingFacade> stub,
User[] users)
{
stub.Setup(x => x.GetUsers()).Returns(users);
var sut = from x in new Methods<UserService>() select x.GetUsers();
var assertion = new ReturnValueMustNotBeNullAssertion(builder);
Assert.DoesNotThrow(() => assertion.Verify(sut));
}
Run Code Online (Sandbox Code Playgroud)
场景3:如果i为-1则 GetUsers(int)返回null:
[Theory, UnitTestConventions]
public void Scenario3(
ISpecimenBuilder builder,
[Frozen]Mock<IRemotingFacade> stub,
User[] users)
{
stub.Setup(x => x.GetUsers()).Returns(users);
var sut = from x in new Methods<UserService>()
select x.GetUsers(default(int));
var assertion = new ReturnValueMustNotBeNullAssertion(builder);
Assert.Throws<ReturnValueMustNotBeNullException>(
() => assertion.Verify(sut));
}
Run Code Online (Sandbox Code Playgroud)
备注
如果您只安装了F#3.1,则还可以在app.config文件中添加程序集绑定重定向:
<dependentAssembly>
<assemblyIdentity name="FSharp.Core"
publicKeyToken="b03f5f7f11d50a3a"
culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.3.1.0"
newVersion="4.3.1.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)
的UnitTestConventionsAttribute定义为:
internal class UnitTestConventionsAttribute : AutoDataAttribute
{
internal UnitTestConventionsAttribute()
: base(new Fixture().Customize(new AutoMoqCustomization()))
{
}
}
Run Code Online (Sandbox Code Playgroud)
使用Albedo执行反射查询.
[1]对于演示,我简化了原始代码,如下所示:
public class User
{
}
public interface IRemotingFacade
{
User[] GetUsers();
}
public class UserService
{
private readonly IRemotingFacade remotingFacade;
public UserService(IRemotingFacade remotingFacade)
{
if (remotingFacade == null)
throw new ArgumentNullException("remotingFacade");
this.remotingFacade = remotingFacade;
}
public User[] GetUsers()
{
return this.remotingFacade.GetUsers();
}
public User[] GetUsers(int i)
{
if (i == -1)
return null;
return this.remotingFacade.GetUsers();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1286 次 |
| 最近记录: |