我在.NET平台上使用Xunit和NMock.我正在测试一个方法是异步的表示模型.该方法创建一个异步任务并执行它,以便该方法立即返回,我需要检查的状态尚未准备好.
我可以在完成时设置一个标志而不修改SUT但这意味着我必须继续检查while循环中的标志,例如,可能超时.
我有什么选择?
如果用户没有正确的权限,我想生成一个401页面.
用户请求一个URL并被重定向到登录页面(我在web.config中拒绝所有匿名).用户成功登录并重定向到原始URL.但是,在权限检查时,确定用户没有所需的权限,因此我想生成401.但是表单身份验证始终处理401并将用户重定向到登录页面.
对我来说,这是不正确的.用户已经过身份验证,用户只是没有正确的授权.
在其他场景中,例如在ajax或REST服务场景中,我绝对不希望登录页面 - 我需要正确的401页面.
到目前为止,我已经尝试使用自定义授权过滤器来返回ViewResult 401但无法正常工作.然后,我尝试了一个正常的动作过滤器,覆盖OnActionExecuting,它也不起作用.
我能做的是处理global.asax,PostRequestHandlerExecute中的事件,并检查权限,然后直接写回响应:
if (permissionDenied)
{
Context.Response.StatusCode = 401;
Context.Response.Clear();
Context.Response.Write("Permission Denied");
Context.Response.Flush();
Context.Response.Close();
return;
}
Run Code Online (Sandbox Code Playgroud)
这可行,但它不是我想要的.首先,我甚至不确定这是否是正确的事件或管道中的地方.其次,我希望401页面有更多内容.优选地,它应该是aspx页面,其可能与站点的其余部分具有相同的母版页.这样,浏览网站的任何人都可以看到权限被拒绝但具有相同的外观和感觉等,但是ajax或服务用户将获得正确的状态代码来执行操作.
知道如何实现这一目标吗?我见过其他类似请求的帖子,但没有看到我可以使用的解决方案.
不,我不想要403.
线程池线程完成后,Name或线程本地数据之类的东西会被重置吗?那么当线程下次出现在游泳池中时,它就像全新的一样?
是否有关于ThreadPool线程这方面的"官方"文档?
除了单元测试的好处,我听到的关于MVP模式的是表示层的可重用性.因此,您将设计一个表示层并将其用于WinForms(丰富)和Web.
我目前正在研究.NET中的Windows窗体应用程序,可能会在将来创建Web UI.但是,当我设计表示层和UI层之间的交互时,我不确定这种可重用性的概念是否值得所有麻烦.我有时觉得自己正在为可能的Web UI"减少"我的演示文稿,当它专门为windows窗体UI设计时可以更多.
那么,有多少人正在获得可重用表示层的好处?在现实世界中,这种可重用性是否会成功?
在集成测试中,异步流程(方法,外部服务)构成了非常严格的测试代码.相反,我考虑了异步部分并创建了一个依赖项,并为了测试而将其替换为同步,这是一件"好事"吗?
通过用同步过程替换异步过程,我是不是在集成测试的精神下进行测试?我想我假设集成测试是指测试接近真实的东西.
public class StepClause
{
public NamedStepClause Action1() {}
public NamedStepClause Action2() {}
}
public class NamedStepClause : StepClause
{
public StepClause Step(string name) {}
}
Run Code Online (Sandbox Code Playgroud)
基本上,我希望能够做到这样的事情:
var workflow = new Workflow().Configure()
.Action1()
.Step("abc").Action2()
.Action2()
.Step("def").Action1();
Run Code Online (Sandbox Code Playgroud)
因此,一些"步骤"被命名,一些则没有.
我不喜欢的是StepClause知道它的派生类NamedStepClause.
我尝试了几件事来让我和我坐得更好.我试图将事情移到接口但是然后问题刚刚从具体移到接口 - INamedStepClause仍然需要从IStepClause派生,而IStepClause需要返回INamedStepClause才能调用Step().我也可以将Step()作为完全独立类型的一部分.然后我们没有这个问题,我们有:
var workflow = new Workflow().Configure()
.Step().Action1()
.Step("abc").Action2()
.Step().Action2()
.Step("def").Action1();
Run Code Online (Sandbox Code Playgroud)
哪个好,但我想尽可能选择步骤命名.
我发现这个其他职位上的SO 这里看起来有趣的和有希望的.你有什么看法?我认为最初的解决方案是完全不可接受的,不是吗?
顺便说一句,这些动作方法将采用谓词和仿函数,我认为我不想采取额外的参数来命名那里的步骤.
对我来说,重点是只在一个地方和一个地方定义这些行动方法.因此,使用泛型和扩展方法的参考链接的解决方案似乎是迄今为止最好的方法.
我通常在每个班级中声明以下内容:
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
Run Code Online (Sandbox Code Playgroud)
并使用每个类中的静态成员来记录不同的级别(信息,调试等)
我在某个地方看到并且一直在使用它有点盲目,推断设置足够灵活,可以帮助我按命名空间过滤并记录各个类型,如果我想解决生产问题而不是.
但我很少使用精细伐木的"水平".所以,我想看看其他人在使用什么.您是否使用上述内容,因为我感觉很多人正在使用它,或者您是否创建了命名记录器,如"debug","trace","error","moduleA"等,并在不同类型之间共享记录器,组装?
我最近发现了Presenter First并阅读了他们的白皮书和博客等.
在我发现的大多数示例中,事件不是直接在接口上声明,而是作为它的方法.例如,
public interface IPuzzleView
{
void SubscribeMoveRequest(PointDelegate listener);
// vs
event PointDelegate MoveRequest;
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.我以为我在某个地方看到了一篇文章/文章/博客,解释了这背后的原因,但我再也找不到了.所述文本还包含单元测试代码的片段 - 我知道这是因为我记得对自己说,其中一个单元测试是不正确的.
更新:
以下是比较示例:
public class Collect
{
public static CollectAction<T> Argument<T>(int index,
CollectAction<T>.Collect collectDelegate)
{
CollectAction<T> collect = new CollectAction<T>(index, collectDelegate);
return collect;
}
}
public interface IApplicationView
{
event EventHandler Load;
// or
void SubscribeLoad(Action action);
}
Mockery mockery = new Mockery();
IApplicationView view = mockery.NewMock<IApplicationView>();
IApplicationModel model = mockery.NewMock<IApplicationModel>();
Run Code Online (Sandbox Code Playgroud)
订阅风格:
Action savedAction = null;
Expect.Once.On(view).Method("SubscribeLoad").Will(
Collect.Argument<Action>(0,
delegate(Action action) …Run Code Online (Sandbox Code Playgroud) 通过"垂直分区",我的意思是命名空间以模块而不是"层"命名
所以,
代替,
我遇到的唯一问题是,有时这些程序集可能具有与类型名称相同的命名空间的一部分.
假设我创建了一个与帐户相关的模块,并将其命名为MyApp.Account.dll,其基本命名空间为MyApp.Account.不可避免地,我需要创建一个名为Account的类.然后我必须使用命名空间或类型别名.
除了对名字非常有创意外,是否有其他人以这种方式体验切割组件并处理名称冲突问题?
我知道您可以从存储过程和设计器生成的方法返回多个结果.
但是,我正在尝试使用ExecuteQuery做同样的事情,但它似乎不可能.有没有人试过或知道这是否可行?
基本上我正在尝试运行ad-hoc存储过程.ad-hoc是指在设计时不可用的存储过程.
.net ×4
mvp ×2
asp.net ×1
asp.net-mvc ×1
assemblies ×1
asynchronous ×1
c# ×1
executequery ×1
linq-to-sql ×1
log4net ×1
logging ×1
model ×1
namespaces ×1
naming ×1
nmock ×1
oop ×1
presentation ×1
reusability ×1
sql-server ×1
testing ×1
threadpool ×1
unit-testing ×1
view ×1
xunit.net ×1