Возникла исключительная ситуация при использовании библиотеки Moq-Mock - PullRequest
0 голосов
/ 22 ноября 2018

Я использую Moq и понимаю, что в этой ситуации я получил исключение Ambiguous match found, в котором мне нужна помощь:

Вот мои модели:

public class User
{
}

public class CustomUser
{
}

Некоторые классы:

public class BaseClass
{
    public virtual User User { get; set; }
}

public class Father : BaseClass
{
    public virtual new CustomUser User { get; set; }
}

public class Child : Father
{
}

И наконец:

void Main()
{
    var user = new Mock<CustomUser>();
    var child = new Mock<Child>();
    child.SetupGet(x=>x.User).Returns (user.Object);  // Ambiguous match found.
}

Обновление:
Почему я использую это ?!Поскольку я кодирую MVC-WebAPI, и у меня есть BaseController, который наследует ApiController.
OK, в ApiController у нас есть свойство IPrincipal User, которое я переопределил с помощью своей реализации ICustomPrinciple ( эта ссылка ).
Теперь я хочу издеваться, например, ProductController : BaseController.

var controller = new Mock<ProductController>();
var user = new Mock<CustomPrincipal>();

user.SetupGet(x => x.FullName).Returns("some full name");

controller.SetupGet(x => x.UserRoleID).Returns(81);// UserRoleID is getter and I do some stuff here.
controller.SetupGet(x => x.User).Returns(user.Object);

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Для работы макета необходимо свойство virtual, которое в случае наследования не существует в базовом классе (нет двусмысленности)

Таким образом, вы можете переименовать свойство, как предложил Рахул, или изменить BaseClassсодержать общее свойство:

public class BaseClass<TUser>
{
    public virtual TUser User { get; set; }
}

public class Father : BaseClass<CustomUser>
{
}

...
child.SetupGet(x=>x.User).Returns (user.Object);  // Works!
0 голосов
/ 22 ноября 2018

Почему вы меняете или скрываете базовый тип, и в этом проблема.Если вы хотите определить отдельный член, возвращающий отдельный тип, сделайте это так, как показано ниже, и теперь ваш макет не должен жаловаться, когда вы говорите child.SetupGet(x => x.User1).Returns(user.Object);.Вы изменяете тип свойства с User на Customuser, и эти две сущности не имеют сходства между ними.

1005 *
...