让我限定这个问题.我正在开发一个"经典"的ASP.NET应用程序(Web窗体),它不使用Model-View-Presenter而且不是使用TDD编写的.它还使用过时的数据访问策略(手写DAO层调用存储过程来填充和持久化对象),尽管我强烈希望这样做,但它不太可能升级到ORM.
自从我接手开发应用程序以来,大多数新功能都是使用TDD实现的.这仍旧旧代码库,DAL层和整个UI未经测试.在我弄清楚应用程序距离神秘的70%代码覆盖率目标有多远之前,我想清楚一下在确定代码覆盖率时通常包含哪种代码.
明确包含业务逻辑代码,但WebForms代码如何?另外,数据访问代码怎么样?如上所述,我们的数据访问层使用存储过程来填充对象图并将它们保存回DB.物体持久性和再水化是否应包括在内?
我很抱歉,如果这个问题太开放,我只是觉得有点不知所措,并且对如何使这个棕色地块应用程序更好地形成一些困惑.
谢谢!
我有一个工厂类,它决定它应该实例化和返回的四个可用子类中的哪一个.正如您所料,所有子类都实现相同的接口:
public static class FooFactory{
public IFoo CreateFoo(FooEnum enum){
switch (enum)
{
case Foo1:
return new Foo1();
case Foo2:
return new Foo2();
case Foo3:
return new Foo3(IBar);//has a constructor dependency on IBar
case Foo4:
return new Foo4();
default:
throw new Exception("invalid foo!");
}
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,其中一个子类在其构造函数中定义了依赖项.
一些兴趣点:
IFoo都是域对象,因此不会被Spring.NET实例化.如果可能的话,我想保持这种方式.我试图找出如何最好地将IBar依赖关系传递Foo3给FooFactory.我觉得这可能是通过IoC最好解决的问题,但我不能理解如何.我还希望尽可能保持FooFactory单元可测试:即我不希望在测试代码中依赖Spring.NET.
谢谢阅读.
我在ASP.NET WebForms应用程序中使用了Model-View-Presenter的样板实现.My View有两个重要事件,一个表示用户已在域模型上填写了足够的字段以启动复制检查,另一个是常规的Save事件.我的伪代码看起来像这样:
public class ItemNewPresenter : PresenterBase<IItemNewView>
{
public IItemService Service { get; private set; }
public IItemNewView View { get; private set; }
public ItemNewPresenter(IItemService service, IItemNewView view)
{
Service = service;
View = view;
View.OnSave += DoItemSave;
View.OnItemIsDuplicateCheck+= DoItemIsDuplicateCheck;
}
private void DoItemIsDuplicateCheck(object sender, CheckItemDuplicateEventArgs e)
{
CheckForItemDuplication(e.Item);
}
private void CheckForItemDuplication(Item item){
if (Service.IsDuplicateItem(item))
{
View.RedirectWithNotification(BuildItemUrl(item), "This item already exists");
}
}
private void DoItemSave(object sender, SaveItemEventArgs e)
{
DoItemIsDuplicateCheck(this, e.ToItemDuplicateEventArgs());
Service.Save(e.Item);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试,用于确保从视图中引发OnItemIsDuplicateCheck时我的演示者行为正常:
[Test] …Run Code Online (Sandbox Code Playgroud) 我正在开发一个新的MVC应用程序,该应用程序将主要使用TDD编写.我想补充一些集成测试,以确保完全有线应用(我用StructureMap海委会,NHibernate的持久性)按预期工作.
虽然我打算用Selenium编写一些功能性烟雾测试,但出于可维护性的原因,我宁愿通过使用旧的C#在我的控制器上直接调用操作来进行大部分集成测试.
关于如何实现这一目标的指导令人惊讶,因此我对攻击计划进行了抨击
我已经完成了第1步,但实际上不知道如何继续第2步.任何指导都将不胜感激.
public class Bootstrapper
{
public static void Bootstrap()
{
DependencyResolverInitializer.Initialize();
FilterConfig.RegisterFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders.DefaultBinder = new SharpModelBinder();
}
}
public class DependencyResolverInitializer
{
public static Container Initialize()
{
var container = new Container();
container.Configure(x => x.Scan(y =>
{
y.Assembly(typeof(Webmin.UI.FilterConfig).Assembly);
y.WithDefaultConventions();
y.LookForRegistries();
}));
DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
return container;
}
}
public class StructureMapDependencyResolver : IDependencyResolver
{
private readonly IContainer _container;
public StructureMapDependencyResolver(IContainer container)
{
_container = container;
}
public object GetService(Type serviceType)
{
if (serviceType.IsAbstract || serviceType.IsInterface) …Run Code Online (Sandbox Code Playgroud) 我正在设计一个医院集成系统,它消耗来自不同医院(我们的客户)的数据,然后根据数据库的读取配置将特定的业务规则应用于所述数据.如果我使用Java,我的第一直觉是构建一系列代表各种业务规则的接口,然后注入具体实例(使用Spring/guice)来组成一个完全配置的对象.这样我就可以在配置逻辑(什么商业规则应该适用于Hospital Foo?)和实际的业务规则本身之间实现清晰的分离.
不幸的是,我没有使用Java,我正在使用Lua.在过去的几天里,我沉浸在Lua文学中,与DI最接近的模拟似乎是模块的使用.此外,似乎管理lua模块在运行时如何解析的规则完全基于询问本地文件系统.
"模块模式"是实现我之后的最佳/唯一方式(将配置逻辑与业务逻辑分离)吗?如果是这样,如何利用Lua的模块加载规则来改变运行时加载的实际模块?
我想在Lua的数据结构上创建一个自定义包含方法table来检查密钥是否存在.用法看起来像这样:
mytable = {}
table.insert(mytable, 'key1')
print(mytable.contains('key1'))
Run Code Online (Sandbox Code Playgroud)
谢谢.
我在创建单个进程时成功重定向输出.但是,当THAT进程产生其他进程时,不会重定向输出.除了创建初始过程之外,我无法控制如何/何时实例化孙子进程.似乎唯一的其他选项可能是Win32 API调用,但我没有找到这种方法的证据.
c# ×2
lua ×2
unit-testing ×2
asp.net ×1
asp.net-mvc ×1
brownfield ×1
factory ×1
mvccontrib ×1
oop ×1
spring.net ×1
tdd ×1
webforms ×1
winapi ×1