2011-04-06 9 views
6

¿Por qué falla esta declaración simple de afirmación? Por lo que he leído, debería ser. Desafortunadamente, como la funcionalidad es tan básica, no hay mucha información disponible.Simple `Assert.IsAssignableFrom <T>` falla

public interface IDummy{} 
public class Dummy : IDummy {} 

Assert.IsAssignableFrom<IDummy>(new Dummy()); 

Operando rendimientos de esta prueba

Expected: assignable from <Application.Tests.ViewModels.IDummy> 
    But was: <Application.Tests.ViewModels.Dummy> 

me han tratado de intercambio de la interfaz y los objetos lado en vano.

Respuesta

7

IsAssignableFrom funciona en reversa de lo que esperaba. Se está preguntando: Is (the value) Assignable From IDummy. O: "¿Es asignable a (valor)?"

Del doc XML: /// Afirma que a un objeto se le puede asignar un valor de un tipo dado.

es probable que desee Assert.IsInstanceOfType()

+1

Ah, eso funciona. Gracias. ¿Cuál es el propósito de 'IsAssignableFrom' entonces? – gcso

+0

@gsco, vea mi respuesta a continuación – dotnetguy

1

Para el beneficio de los que la tierra aquí a través de Google (o Bing :-))

Assert.IsAssignableFrom<T>(object actual) está destinado a comprobar si el objeto que está siendo examinado puede ser sustituido por el T. tipo Efectivamente, lo que esto significa es que la afirmación está probando un "es-a" relación entre el objeto examinado y el tipo T.

a ver algo de código (simplificado intencionalmente):

// The Base class 
public class Employee 
{ 
    public int EmployeeId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime DateOfJoining { get; set; } 
} 

// The derived class 
public class Manager : Employee 
{ 
    public IList<Employee> EmployeesReporting { get; set; } 
} 

Ahora la afirmación:

// NOTE: using Assert = NUnit.Framework.Assert; 
[TestMethod] 
public void Test_IsAssignableFrom() 
{ 
    var employee = new Employee(); 

    // Manager is-a Employee, so the below is true 
    Assert.IsAssignableFrom<Manager>(employee);  
} 

Considerando que el IsInstanceOf<T>(object actual) está destinado a comprobar si el objeto que está siendo probado es (como el nombre sugiere) una instancia de tipo T - pocas palabras, si "actual" es el tipo T o un tipo derivado de T

[TestMethod] 
public void Test_IsAssignableFrom() 
{ 
    var manager = new Manager(); 

    // Manager derives from Employee so the below is true 
    Assert.IsInstanceOf<Employee>(manager); 
} 

EDITAR Resulta que, éstos afirma trabajar de la misma manera como los métodos Type.IsAssignableFrom y Type.IsInstanceOf en System.Type

+1

Entonces, en un curso PluralSight de Mark Seeman, usa xUnit. Hay una clase definida como 'public class SimpleWebToken: IEnumerable {...}'. Luego, en su prueba xUnit tiene 'Assert.IsAssignableFrom > (sut)' (donde 'sut' es una instancia de' SimpleWebToken'). Y esta prueba pasa! Pero, en general, debería fallar. Al usar exactamente la misma aserción con NUnit, la prueba falla. Y, ejecutando 'var good = SimpleWebToken.GetType(). IsAssignableFrom (typeof (IEnumerable )); // good = false' me da el resultado 'falso' esperado. Hmmm, estoy perdiendo la confianza en los marcos de prueba. – fourpastmidnight

+0

No importa en esto. xUnit está haciendo algo funky, pero genial, porque imita cómo se usa el método 'System.Type.IsAssignableFrom (Type)' en el BCL. NUnit, por otro lado, tiene los métodos de restricción 'IsAssignableFrom' y' IsAssignableTo' que están al revés del BCL. Por lo tanto, al usar la reflexión, usaría 'IsAssignableFrom', pero al escribir una aserción en NUnit, usaría la restricción' Is.AssignableTo () '. Confuso. – fourpastmidnight

Cuestiones relacionadas