我有一个类来检索内容,它有一个方法,在检索它之前需要一些输入(过滤器).其中一个"输入"调用另一个方法,它基本上返回一个int,如何使用MOQ模拟它?这是一个例子:
namespace MyNamespace
{
public class ConfigMetaDataColumns : MyModel
{
public int FieldID { get { return ValueInt("FieldID"); } }
public int OrderId { get { return ValueInt("OrderId"); } }
public string Label { get { return ValueString("Label"); } }
public string FieldName { get { return ValueString("FieldName"); } }
public int IsReadOnly { get { return ValueInt("IsReadOnly"); } }
}
public class GetDataClass
{
protected OpenSQLAccessLayer m_WITObject;
// Input Properties
public string GroupID;
public string PageName;
// Output Properties
/// <summary>
/// Get Config meta data
/// </summary>
/// <returns></returns>
public IEnumerable<ConfigMetaDataColumns> GetConfigMetaData()
{
var requester = new ListRequester<OpenSQL, ConfigMetaDataColumns>(m_WITObject, "Result[0].RowCount", "Result[0].Row[{0}].");
return requester.Items;
}
public void InitRequest()
{
User user = (User)HttpContext.Current.User;
m_WITObject = user.NewService<OpenSQLAccessLayer>();
m_WITObject.SetInput("MultipleResultSets", 1);
m_WITObject.SetInput("ClientID", Utils.GetClientID());
m_WITObject.SetInput("GroupID", GroupID);
m_WITObject.SetInput("PageName", PageName);
m_WITObject.Retrieve();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是"GetClientID()"方法:
public static int GetClientID()
{
User oUser = (User)HttpContext.Current.User;
int nClientID;
string sClientID = string.Empty;
if (String.IsNullOrEmpty(oUser.Session("clientid")))
{
Client oClient = new Client();
}
oUser = (User)HttpContext.Current.User;
sClientID = oUser.Session("clientid");
//If we couldn't retrieve it, throw exception
if ( string.IsNullOrEmpty(sClientID) || !int.TryParse(sClientID, out nClientID))
{
throw new Exception("No clientid found in user session, client not authenticated, please login from main page");
}
return nClientID;
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法让我传递ClientID的硬编码值,并使用它来使用GetDataClass类进行一些单元测试.
谢谢.
你不能模拟静态方法.你应该使用一些依赖注入方法.假设您将GetClientId方法作为一个名为的接口的一部分IUtils:
public interface IUtils
{
int GetClientId();
}
Run Code Online (Sandbox Code Playgroud)
并且您已经Utils按照上面的方式实现了具体类,但是没有方法是静态的(并且当然实现了接口).您现在GetDataClass
通过更改其构造函数将接口的实现注入到类中,如下所示:
public class GetDataClass
{
private readonly IUtils utils;
public GetDataClass(IUtils utils)
{
this.utils = utils;
}
//SNIP
}
Run Code Online (Sandbox Code Playgroud)
在InitRequest方法中,您将呼叫更改Utils.GetClientID()为this.utils.GetClientId().
您现在已准备好GetDataClass使用模拟实例化您的类,如下所示:
var utilsMock = new Mock<IUtils>();
utilsMock.Setup(u => u.GetClientId()).Returns(42);
var getDataClass = new GetDataClass(utilsMock.Object);
getDataClass.InitRequest();
Run Code Online (Sandbox Code Playgroud)
就是这样.
| 归档时间: |
|
| 查看次数: |
2805 次 |
| 最近记录: |