标签: moq

用Moq调用原始方法

我有一个带有2个方法的ProductRepository,GetAllProducts和GetProductByType,我想在GetProductByType上测试逻辑.在内部,GetProductByType调用GetAllProducts,然后过滤正确的.

public virtual IEnumerable<Product> GetAllProducts()
{
    //returns all products in memory, db etc
}

public virtual IEnumerable<Product> GetProductsByType(string type)
{
    return (from p in GetAllProducts() where p.Type == type select p).ToList();
}
Run Code Online (Sandbox Code Playgroud)

因此,在我的测试中,我想模拟对GetAllProducts的调用,因此它返回在我的测试中定义的产品列表,然后调用原始的GetProductsByType,它将使用模拟的GetAllProducts.

我正在尝试类似下面的代码,但原始的GetProductByType没有被执行,它也被模拟了.在TypeMock中,我有一个CallOriginal方法来解决这个问题,但我无法用Moq来解决这个问题.有任何想法吗?

var mock = new Mock<ProductRepository>();
mock.Setup(r => r.GetAllProducts()).Returns(new List<Product>() {p1, p2, p3});
var result = mock.Object.GetProductsByType("Type1");
Assert.AreEqual(2, result.Count());
Run Code Online (Sandbox Code Playgroud)

c# moq mocking

46
推荐指数
2
解决办法
1万
查看次数

模拟任何给定类型参数的泛型方法调用

我有一个界面

public interface IDataProvider
{
    T GetDataDocument<T>(Guid document) where T:class, new()
}
Run Code Online (Sandbox Code Playgroud)

我想以某种方式模拟它,它只会返回给定类型的新实例,而不管确切的类型,如:

myMock.Setup(m => m.GetDataDocument<It.IsAny<Type>()>(It.IsAny<Guid>()))
.Returns(() => new T());
Run Code Online (Sandbox Code Playgroud)

(当然不起作用,因为我不能只给moq提供任何类型参数,我不知道必须返回哪种类型.

关于这个的任何想法?

c# moq

46
推荐指数
4
解决办法
3万
查看次数

如何将项添加到Mock DbSet(使用Moq)

我正在尝试设置一个模拟DbSet用于测试目的.我在这里使用了这个教程,http://www.loganfranken.com/blog/517/mocking-dbset-queries-in-ef6/并略微修改了它,所以每次调用GetEnumerator都会返回一个新的枚举器(我遇到的另一个问题) .但是,我在向DbSet添加项目时遇到困难.

输出是preCount = 3 postCount = 3.但是,我希望它是precount = 3 postCount = 4.非常感谢任何帮助.

static void Main(string[] args)
    {
        Debug.WriteLine("hello debug");

        List<string> stringList = new List<string>
        {
            "a", "b", "c"
        };

        DbSet<string> myDbSet = GetQueryableMockDbSet(stringList);
        int preCount = myDbSet.Count();
        myDbSet.Add("d");
        int postCount = myDbSet.Count();
        Debug.WriteLine("preCount = " + preCount + " postCount = " + postCount);
    }

    private static DbSet<T> GetQueryableMockDbSet<T>(List<T> sourceList) where T : class
    {
        var queryable = sourceList.AsQueryable();

        var dbSet = new Mock<DbSet<T>>();
        dbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider); …
Run Code Online (Sandbox Code Playgroud)

c# linq moq dbset

45
推荐指数
1
解决办法
2万
查看次数

如何使用Moq模拟会话对象集合

我正在使用shanselmann的MvcMockHelper类来使用Moq模拟一些HttpContext的东西,但我遇到的问题是能够在我的MVC控制器中为我的模拟会话对象分配一些东西,然后能够在我的单元测试中读取相同的值以进行验证目的.

我的问题是如何将存储集合分配给模拟的会话对象,以允许诸如session ["UserName"] ="foo"之类的代码保留"foo"值并使其在单元测试中可用.

tdd asp.net-mvc unit-testing moq

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

Moq和Rhino.mocks有什么功能?

我找不到Moq和Rhino的特定功能比较.所有的问题都是"你更喜欢哪些以及为什么",或者"这里是你如何在犀牛中进行简单的模拟以及如何在moq中完成".

我无法在任何地方找到深刻的比较.我知道语法上的差异,我不是在寻找答案. 我正在寻找能力比较.例如:

  • Rhino有Expect.On()用于线程模拟.Moq可以这样做吗?

  • 那么多模拟(用一个模拟实现多个接口).Moq可以这样做吗?

  • 我相信Moq现在可以模拟受保护的成员.犀牛可以这样做吗?

编辑:我最后还看了一些其他.Net框架.

rhino-mocks moq typemock mocking nmock2

44
推荐指数
1
解决办法
5797
查看次数

Moq - 如何验证通过setter设置的属性值

考虑这个课程:

public class Content
{      
   public virtual bool IsCheckedOut {get; private set;}
   public virtual void CheckOut()
   {
      IsCheckedOut = true;
   }

   public virtual void CheckIn()
   {
      //Do Nothing for now as demonstrating false positive test.
   }
}
Run Code Online (Sandbox Code Playgroud)

Checkin方法故意为空.现在我有一些测试方法来验证调用每个方法的状态.

[TestMethod]
public void CheckOutSetsCheckedOutStatusToTrue()
{
    Content c = new Content();    
    c.CheckOut();
    Assert.AreEqual(true, c.IsCheckedOut); //Test works as expected
}

[TestMethod]
public void CheckInSetsCheckedOutStatusToFalse()
{
    Content c = new Content();
    c.CheckIn();
    Assert.AreEqual(false, c.IsCheckedOut); //Test does not work as expected
}
Run Code Online (Sandbox Code Playgroud)

第二次测试通过了错误的原因.那么我如何使用mocking(moq)来验证CheckIn是否设置了IsCheckedOut属性?

谢谢.

编辑

澄清一下:我有一个名为CheckIn()的方法,其工作是将IsCheckedOut状态设置为false. …

.net c# tdd moq mocking

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

在Moq中VerifyAll()的目的是什么?

在Moq看到了Verifiable()的目的是什么?在我的脑海里有这个问题.需要你的帮助解释一下.

unit-testing moq

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

模拟新的Microsoft Entity Framework Identity UserManager和RoleManager

有没有人想出了一个成功的嘲弄解决方案UserManagerRoleManager?我整天都在靠墙打我的头.我想要做的就是模拟对象以使用内存集合而不是命中Entity Framework数据存储.我已经浏览了互联网并尝试了几种使用MOQ的不同方法.

我的印象是新东西更容易测试.我错过了什么吗?

c# unit-testing entity-framework moq asp.net-identity

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

Moq与任务等待

由于我已将我的WCF方法转换为Async,因此我的单元测试失败了,我无法找出正确的语法来使它们工作.

Cllient代理类

 public interface IClientProxy
{
     Task DoSomething(CredentialDataList credentialData, string store);
}
Run Code Online (Sandbox Code Playgroud)

服务类

  public class CredentialSync : ICredentialSync
{
    private ICredentialRepository _repository;

    private IClientProxy _client;

    public CredentialSync()
    {
        this._repository = new CredentialRepository();
        this._client = new ClientProxy();
    }

    public CredentialSync(ICredentialRepository repository, IClientProxy client)
    {
        this._repository = repository;
        this._client = client;
    }

   public async Task Synchronise(string payrollNumber)
    {
        try
        {
            if (string.IsNullOrEmpty(payrollNumber))
            {
                .... some code
              }
            else
            {
                CredentialDataList credentialData = new CredentialDataList();
                List<CredentialData> credentialList = new List<CredentialData>();

                // fetch the …
Run Code Online (Sandbox Code Playgroud)

.net c# asynchronous moq async-await

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

如何使用mock为不同的参数设置两次方法

我想用Moq设置一个方法两次,但似乎最后一个覆盖了之前的方法.这是我的初始设置:

string username = "foo";
string password = "bar";

var principal = new GenericPrincipal(
    new GenericIdentity(username),
    new[] { "Admin" });

var membershipServiceMock = new Mock<IMembershipService>();
membershipServiceMock.Setup(ms =>
    ms.ValidateUser(username, password)
).Returns(new ValidUserContext { 
    Principal = principal
});
Run Code Online (Sandbox Code Playgroud)

这很好但我希望这返回new ValidUserContext()如果用户名或密码而不是上面的usernamepassword变量.为此,我添加了另一个设置,但这次它会覆盖上面的设置并始终应用它:

membershipServiceMock.Setup(ms =>
    ms.ValidateUser(It.IsAny<string>(), It.IsAny<string>())
).Returns(
    new ValidUserContext()
);
Run Code Online (Sandbox Code Playgroud)

使用Moq处理此类情况的最优雅方式是什么?

编辑

我通过以下方法解决了问题,但我想有更好的方法来处理这个问题:

var membershipServiceMock = new Mock<IMembershipService>();
membershipServiceMock.Setup(ms =>
    ms.ValidateUser(It.IsAny<string>(), It.IsAny<string>())
).Returns<string, string>((u, p) => 
    (u == username && p == password) ?
    new ValidUserContext { 
        Principal …
Run Code Online (Sandbox Code Playgroud)

.net c# unit-testing moq

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