use*_*980 3 c# unit-testing moq
我们什么时候需要使用.AsMoq提供的方法?
从快速入门文档:
// implementing multiple interfaces in mock
var foo = new Mock<IFoo>();
var disposableFoo = foo.As<IDisposable>();
// now the IFoo mock also implements IDisposable :)
disposableFoo.Setup(df => df.Dispose());
Run Code Online (Sandbox Code Playgroud)
但我只是不明白我们为什么要那样做.你能给我一个实际的例子吗?
当您需要测试实现多个接口的对象时,可以使用As方法.
在此示例中,如果输入对象也实现了IDisposable,则测试代码具有特定行为.像这样的东西:
public void Execute(IFoo input)
{
// do process...
IDisposable disposable = input as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
类实现:
public class ConcreteFoo: IFoo, IDisposable
{
...
}
Run Code Online (Sandbox Code Playgroud)
编辑:
Moq的配置需要:
var foo = new Mock<IFoo>();
var disposableFoo = foo.As<IDisposable>();
disposableFoo.Setup(df => df.Dispose());
// Verify whether the Dispose() method was called
// That's true only if we use the As method from Moq.
testedClass.Execute(disposableFoo);
disposableFoo.Verify(m => m.Dispose());
Run Code Online (Sandbox Code Playgroud)
好的,这是一个例子.假设你有一个运输管理软件来管理汽车,飞行等的运动.有不同的车辆,但它们在陆地或空中移动(没有海来简化样本).
public interface IMovingOnLand
{
string Move();
}
public interface IMovingInAir
{
string Move();
}
Run Code Online (Sandbox Code Playgroud)
并且有车辆/飞机的快速运输选项.
public interface IExpressTransport
{
string MoveDirectly();
}
Run Code Online (Sandbox Code Playgroud)
有一个运输经理班负责移动所有车辆/飞机.并且它处理快速传输方式与常规传输方式不同(为了简单起见,在此示例中,它仅根据是否为IExpressTransport打印不同的消息):
public class TransportManager
{
public string MoveItem(IMovingInAir airCraft)
{
if (airCraft is IExpressTransport)
{
return "Message from an express aircraft: " +
((IExpressTransport)airCraft).MoveDirectly();
}
return "Message from an aircraft: " + airCraft.Move();
}
public string MoveItem(IMovingOnLand landVehicle)
{
if (landVehicle is IExpressTransport)
{
return "Message from an express land vehicle: " +
landVehicle.Move() +
((IExpressTransport)landVehicle).MoveDirectly();
}
return "Message from a land vehicle: " + landVehicle.Move();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您想测试飞机的行为是否与汽车不同.而且,如果常规航班的处理方式与快速航班不同.因此,您将对象作为IMovingInAir对象进行测试IExpressTransport.要仅测试飞行行为,您只需将其创建为Mock<IMovingInAir>.但是要将航班延长至快速航班,您必须使用以下As<IExpressTransport>()方法:
[TestMethod]
public void TestTransportManager()
{
TransportManager manager = new TransportManager();
// Create a regular flight.
var flight = new Mock<IMovingInAir>();
flight.Setup(x => x.Move())
.Returns("Air craft moved to next stop.");
// Create a flight.
var flightExpress = new Mock<IMovingInAir>();
// Add standard behaviour.
flightExpress
.Setup(x => x.Move())
.Returns("Air craft moved to next stop.");
// Extend to express and add express flight behaviour.
flightExpress
.As<IExpressTransport>()
.Setup(x => x.MoveDirectly())
.Returns("Air craft moved directly to destination.");
// Get the results.
var res = manager.MoveItem(flight.Object);
var resExp = manager.MoveItem(flightExpress.Object);
// Sssert flight and express fligh returned different messages.
Assert.AreNotEqual(res, resExp);
// Assert the expected messages have been returned.
Assert.AreEqual("Message from an aircraft: Air craft moved to next stop.", res);
Assert.AreEqual("Message from an express aircraft: Air craft moved directly to destination.", resExp);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2337 次 |
| 最近记录: |