小编jon*_*ell的帖子

表达式<Func <T,bool >>的Moq'ing方法作为参数传入

我对单元测试和嘲笑很新!我正在尝试编写一些单元测试,其中包含一些与数据存储交互的代码.数据访问由IRepository封装:

interface IRepository<T> {
    ....
    IEnumerable<T> FindBy(Expression<Func<T, bool>> predicate);
    ....
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用具体的IoC实现的IRepository来测试的代码如下所示:

public class SignupLogic {
    private Repository<Company> repo = new Repository<Company>();

    public void AddNewCompany(Company toAdd) {
        Company existingCompany = this.repo.FindBy(c => c.Name == toAdd.Name).FirstOrDefault();

        if(existingCompany != null) {
            throw new ArgumentException("Company already exists");
        }

        repo.Add(Company);
        repo.Save();
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,我正在测试SignupLogic.AddNewCompany()本身的逻辑,而不是逻辑和具体的存储库,我正在模拟IRepository并将其传递给SignupLogic.模拟的存储库看起来像这样:

Mock<Repository> repoMock = new Mock<Repository>();
repoMock.Setup(moq => moq.FindBy(c => c.Name == "Company Inc")....
Run Code Online (Sandbox Code Playgroud)

它返回一个内存中的IEnumberable,其中包含名称设置为"Company Inc"的Company对象.调用SignupLogic.AddNewCompany的单元测试会设置一个具有重复详细信息和trys的公司来传递它,并且我断言抛出了ArgumentException,并显示消息"公司已存在".这个测试没有通过.

在运行时通过单元测试和AddNewCompany()进行调试,似乎existingCompany始终为null.无奈之下,我发现如果我更新SignupLogic.AddNewCompany()以便对FindBy的调用如下所示:

Company existingCompany = this.repo.FindBy(c => c.Name == "Company Inc").FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

测试通过,这告诉我,Moq只响应与我在测试夹具中设置的代码完全相同的代码.显然,在测试任何重复的公司被SignupLogic.AddNewCompany拒绝时,这并不是特别有用.

我已经尝试设置moq.FindBy(...)来使用"Is.ItAny",但这并不会导致测试通过.

从我正在阅读的所有内容来看,似乎我正在尝试测试表达式实际上并不能在这里使用Moq.可能吗?请帮忙!

c# unit-testing moq

60
推荐指数
2
解决办法
3万
查看次数

如何动态添加到 ASP.NET MVC RouteTable?

我们的网站上有一个区域,人们可以在其中注册并在我们想要托管的网站上获得自己的页面 ~/ pageSlug。我尝试使用 Global.asax 中的规则来执行此操作,但这破坏了允许 ~/ Controller直接映射到 Index 操作的基本默认路由。我不允许在 userSlug 前面放置任何类型的分隔符,因此 ~/p/ pageSlug在这里并不是真正的选项。

在将用户页面添加到路由方面,我循环浏览 App_Start 处的页面并将它们显式添加到 RoutesTable 中。这工作正常,并且我们已经将 AppPool 刷新设置得足够长,使其成为每天一次的任务。这确实给我们留下了 24 小时的时间来为我们的用户“让页面上线”,这是我正在努力解决的问题。

理想情况下,我想要做的是在用户注册后将相关路由动态添加到 RouteTable。我尝试这样做:

RouteTable.Routes.Add(
    RouteTable.Routes.MapRoute(
        toAdd.UrlSlug + "Homepage", 
        toAdd.UrlSlug, 
        new { controller = "Controller", View = "View", urlSlug = toAdd.UrlSlug }
    )
);
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用。我在其他地方找不到解决方案,而且我确信我的代码非常幼稚,而且暴露出对路由缺乏了解 - 请帮忙!

asp.net-mvc routes routetable

5
推荐指数
2
解决办法
7581
查看次数

标签 统计

asp.net-mvc ×1

c# ×1

moq ×1

routes ×1

routetable ×1

unit-testing ×1