C# 使用Moq,我如何模拟一个方法来改变作为参数的流?
我正在尝试测试以下方法:C# 使用Moq,我如何模拟一个方法来改变作为参数的流?,c#,unit-testing,devexpress,moq,C#,Unit Testing,Devexpress,Moq,我正在尝试测试以下方法: public void SaveDashboardToPersistentDashboard( Dashboard dashboard, PersistentDashboard persistentDashboard) { using (MemoryStream stream = new MemoryStream()) { dashboard.SaveToXml(stream); persistentDashboa
public void SaveDashboardToPersistentDashboard(
Dashboard dashboard, PersistentDashboard persistentDashboard)
{
using (MemoryStream stream = new MemoryStream())
{
dashboard.SaveToXml(stream);
persistentDashboard.Definition = stream.ToArray();
persistentDashboard.Name = dashboard.Title.Text;
_unitOfWork.CommitChanges();
}
}
该方法使用DevExpress仪表板,调用SaveToXml
(传入MemoryStream
),然后将流数组写入PersistentDashboard
POCO的定义
属性
我无法控制Dashboard类,但希望模拟SaveToXml
方法,将Dashboard方法行为从测试中排除。这将涉及获取内部流并将已知字节数组写入其中
我是Moq新手,无法确定如何更改传递到SaveToXml的流的内容-至少在不将流传递到SaveDashboardToPersistentDashboard
方法的情况下。流是该方法行为的附带部分,因此我并不特别喜欢将其作为参数传递
有什么方法可以实现我的目标吗?这是您的设计问题。不使用您使用的模拟库 如果您希望代码是可测试的,那么直接访问框架通常是个坏主意。这甚至包括.NET框架本身。虽然使用
DateTime
通常是安全的,但使用File
已经成为一种巨大的痛苦
我建议为您使用的DevExpress
类创建包装器类。然后从中提取您在业务逻辑中使用的接口。你可以在测试中模仿它们,那没问题
诸如此类:
public interface IDashboard
{
void SaveToXml(Stream stream);
}
public class DashboardWrapper : IDashboard
{
private readonly Dashboard dashboard = new Dashboard();
public void SaveToXml(Stream stream)
{
this.dashboard.SaveToXml(stream);
}
}
您可以使用抽象工厂或IoC容器来创建这些包装器
ETA:不确定这些
仪表板对象是如何实例化的。或者,为包装器提供一个构造函数,该构造函数接受仪表板
实例,并为使用该构造函数的隐式转换实现一个运算符。这是您的设计中的一个问题。不使用您使用的模拟库
如果您希望代码是可测试的,那么直接访问框架通常是个坏主意。这甚至包括.NET框架本身。虽然使用DateTime
通常是安全的,但使用File
已经成为一种巨大的痛苦
我建议为您使用的DevExpress
类创建包装器类。然后从中提取您在业务逻辑中使用的接口。你可以在测试中模仿它们,那没问题
诸如此类:
public interface IDashboard
{
void SaveToXml(Stream stream);
}
public class DashboardWrapper : IDashboard
{
private readonly Dashboard dashboard = new Dashboard();
public void SaveToXml(Stream stream)
{
this.dashboard.SaveToXml(stream);
}
}
您可以使用抽象工厂或IoC容器来创建这些包装器
ETA:不确定这些仪表板对象是如何实例化的。或者,为包装器提供一个构造函数,该构造函数接受仪表板
实例,并为使用该构造函数的隐式转换实现一个运算符。这是您的设计中的一个问题。不使用您使用的模拟库
如果您希望代码是可测试的,那么直接访问框架通常是个坏主意。这甚至包括.NET框架本身。虽然使用DateTime
通常是安全的,但使用File
已经成为一种巨大的痛苦
我建议为您使用的DevExpress
类创建包装器类。然后从中提取您在业务逻辑中使用的接口。你可以在测试中模仿它们,那没问题
诸如此类:
public interface IDashboard
{
void SaveToXml(Stream stream);
}
public class DashboardWrapper : IDashboard
{
private readonly Dashboard dashboard = new Dashboard();
public void SaveToXml(Stream stream)
{
this.dashboard.SaveToXml(stream);
}
}
您可以使用抽象工厂或IoC容器来创建这些包装器
ETA:不确定这些仪表板对象是如何实例化的。或者,为包装器提供一个构造函数,该构造函数接受仪表板
实例,并为使用该构造函数的隐式转换实现一个运算符。这是您的设计中的一个问题。不使用您使用的模拟库
如果您希望代码是可测试的,那么直接访问框架通常是个坏主意。这甚至包括.NET框架本身。虽然使用DateTime
通常是安全的,但使用File
已经成为一种巨大的痛苦
我建议为您使用的DevExpress
类创建包装器类。然后从中提取您在业务逻辑中使用的接口。你可以在测试中模仿它们,那没问题
诸如此类:
public interface IDashboard
{
void SaveToXml(Stream stream);
}
public class DashboardWrapper : IDashboard
{
private readonly Dashboard dashboard = new Dashboard();
public void SaveToXml(Stream stream)
{
this.dashboard.SaveToXml(stream);
}
}
您可以使用抽象工厂或IoC容器来创建这些包装器
ETA:不确定这些仪表板对象是如何实例化的。或者,为包装器提供一个构造函数,该构造函数接受仪表板
实例,并为使用该构造函数的隐式转换实现一个操作符