【发布时间】:2014-08-21 21:26:11
【问题描述】:
出于测试目的,我需要传递一个 HttpFileCollection 实例来进行模拟上传。问题是:我不能模拟这个,因为我需要再次下载文档以仔细检查它作为集成测试。
最大的问题是HttpFileCollection的构造函数被保护了。
谁能帮帮我?
我正在使用类似于这个的自定义 testHandler:
http://blogs.cozi.com/techold/2008/05/a-way-to-unit-t.html
被测代码如下:
public class DocumentUploadHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
var jArray = new JArray();
bool errorOccured = false;
var files = context.Request.Files;
var queryParams = context.Request.QueryString.AllKeys.ToDictionary(k => k.ToLowerInvariant(),
k => context.Request.QueryString[k]);
using (var session = Connection.SessionFactory.OpenSession())
using (var tx = session.BeginTransaction())
{
try
{
int qsSessionId = 0;
if (!queryParams.ContainsKey("sessionid"))
{
throw new ArgumentException("Parameter missing.", "sessionid");
};
if (!int.TryParse(queryParams["sessionid"], out qsSessionId))
{
throw new ArgumentException("Parameter malformed.", "sessionid");
};
var activity = session.Query<Activity>().Fetch(x=>x.Contact).FirstOrDefault(x => x.Session == qsSessionId);
if (activity == null)
{
throw new Exception("Session not found.");
}
string qsFilename = "";
if (queryParams.ContainsKey("filename") && !string.IsNullOrWhiteSpace(queryParams["filename"]))
qsFilename = queryParams["filename"];
for (int i = 0; i < files.Count; i++)
{
if (files[i].ContentLength > 0)
{
var now = DateTime.Now;
var filename = "";
if (string.IsNullOrWhiteSpace(qsFilename))
{
filename = string.Format("{0}_{1}_{2}{3}",
Path.GetFileNameWithoutExtension(files[i].FileName),
activity.Contact.Login,
DateUtils.IsoDateTimeToString(now),
Path.GetExtension(files[i].FileName));
}
else
{
filename = string.Format("{0}_{1}_{2}{3}",
qsFilename,
activity.Contact.Login,
DateUtils.IsoDateTimeToString(now),
Path.GetExtension(files[i].FileName));
}
var document = new Document
{
Code = filename,
Filename = filename,
FileExtension = Path.GetExtension(files[i].FileName),
Client = session.Load<Client>(801),
DocumentType = session.Load<DocumentType>(430),
Imported = now,
Modified = now
};
var fileByteArray = new byte[files[i].ContentLength];
files[i].InputStream.Read(fileByteArray, 0, files[i].ContentLength);
document.FileData = ZlibStream.CompressBuffer(fileByteArray);
session.Save(document);
jArray.Add(document.Id);
}
}
tx.Commit();
}
catch (Exception exception)
{
tx.Rollback();
context.Response.Clear();
context.Response.StatusCode = 200;
context.Response.ContentType = "application/json; charset=utf-8";
context.Response.Output.Write(JsonConvert.SerializeObject(exception, Formatting.Indented));
context.Response.Output.Close();
context.Response.Flush();
errorOccured = true;
}
}
if (errorOccured == false)
{
context.Response.Clear();
context.Response.ContentType = "application/json; charset=utf-8";
context.Response.Output.Write(jArray.ToString());
context.Response.Output.Close();
context.Response.Flush();
}
}
问候
编辑:澄清这一点:如果不向 .asax 端发送真正的 Webrequest,我将如何测试它?我不希望服务器作为我的测试的要求运行
【问题讨论】:
-
指出哪里调用了构造函数?
-
问题是没有调用构造函数但使用了属性: var files = context.Request.Files;为了测试它,我必须构建一个 HttpFileCollection 对象并设置 context.request.files。首先没有设置器,其次没有公共构造函数可以做到这一点。
标签: c# asp.net testing upload mocking