Comment spécifier des gens comme une zone de recherche / Source de contenu à l'aide de SharePoint 2013 API REST

J'ai eu raison de travailler avec SharePoint 2013 API de recherche par l'intermédiaire de repos pour la première fois. J'ai voulu Rechercher des personnes, pas de documents. La clé ici est que l'apprentissage vous spécifiez des sources de contenu via son GUID (ou au moins dans ce cas). JQuery par l'extrait suivant comment:

    loadExpertsAsync: fonction() {

        jQuery.support.cors = True;

        $.Ajax({
            URL: ce.CreateFullApiUrl() +
                "?QueryText = « portails »&SourceId = « b09a7990-05ea-4af9-81ef-edfab16c4e31 »" +
                "&sélectionnezPropriétés ='LinkedInProfileUrl,GoogleCirclesProfileUrl,BALargeProfilePictureUrls,BAGridPictures,WorkEmail,Compétences,AboutMe,Intérêts,JobTitle,PastProjects,PictureURL,PreferredName,TwitterHandle,LinkedInProfileUrl,PreferredName,GoogleCirclesProfileUrl'" +
                "&RowLimit = 99",
            méthode: "Télécharger",
            en-têtes: { "Accepter": "application/json; OData = verbose" },
            cache: faux,
            succès: fonction (résultat) {

Dans mon cas, J'utilise l'API contre SharePoint en ligne. Pour obtenir le GUID, J'ai suivi ces étapes:

  1. Accès au centre d'administration de SharePoint
  2. Sélectionnez « Rechercher » de la navigation de gauche
  3. Sélectionnez « Gérer les Sources de résultat »
  4. Sélectionnez « Les populations locales les résultats »
  5. Regardez l'URL.

Mon URL regardé quelque chose comme:

https://xyzzy-admin.sharepoint.com/_layouts/15/searchadmin/EditResultSource.aspx?level=tenant&sourceid=b09a7990%2D05ea%2D4af9%2D81ef%2Dedfab16c4e31&view=1

Le paramètre ID source est ce qui a fonctionné pour moi.

(Je comprends que l'ID de la source peut en fait être une sorte de chose permanente avec SP, mais je vais toujours vérifier de toute façon 🙂 ).

</fin>

undefinedS'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin

Exemple SharePoint reste appels

Voici une série d'appels de repos échantillon qui fonctionne pour moi et peut vous dépanner ainsi. Comme des 02/2014, il y a deux exemples 🙂

  1. Référencer une colonne avec des espaces dans son nom
  2. Référence une colonne de sélection multiple
  3. Effectuer une recherche de personnes par l'intermédiaire de repos

 

Je vais ajouter à cela que le temps passe.

Voici quelques encres utiles, que j'ai trouvé aussi bien:

Référencer une colonne avec des espaces dans son nom

J'ai créer une liste personnalisée avec une colonne nommée « Auteur du Blog » (espace entre Blog et auteur).

Le $select pour référencer cette colonne est:

image

Il suffit de remplacer l'espace avec « _x0020_ ». Nous voyons le _x0020_ dans beaucoup d'exemples à travers les internets et le reste n'est pas différent.

Si vous ne faites que, vous êtes susceptible d'obtenir un message d'erreur comme ceci:

L'expression “Auteur du blog” n'est pas valide.

Assez facile.

Référence une colonne de recherche sélection multiple

Mettre en place:

  1. Créer une liste personnalisée nommée catégories.
  2. Ajouter certaines catégories. J'ai ajouté des catégories thusly:image
  3. Créer une autre liste personnalisée appelée MockBlog et ajouter des catégories comme une colonne de liste à sélection multiple (ou colonne de site si cela est comment dé).

Ajouter des articles à votre liste de Mockblog et vous êtes prêt.

Un appel de style Ajax en utilisant jQuery ressemblera à quelque chose comme ça:

serverUrl  = "/_API/web/listes/GetByTitle(« MockBlog »)/articles" +
             "?$Sélectionnez = Title,Catégories/titre,Blog_x0020_Author/titre" + 
             "&$Développez = Blog_x0020_Author,Catégories";

Nous sommes en disant SharePoint "Donnez-moi le titre pour toutes les catégories (Catégories/titre). Obtenir les valeurs réelles pour Titre par $DéveloppezING, la liste de catégories. » (Mon paraphrasant RESTful est probablement assez lâche, mais cela comment j'interprète il).

Si vous faites ceci via JavaScript et utiliser Fiddler pour Regardez la sortie, vous obtenez quelque chose comme ça en retour:

 

image

(Ce qui précède est un objet JSON)

Effectuer une recherche de personnes par l'intermédiaire de repos

J'ai blogué sur ce séparément. Il est important de spécifier un paramètre sourceid dont la valeur est le GUID de la source de contenu de populations locales. (Sources de contenu utilisé pour être appelées étendues et c'est oh-Gustave n'est pas si difficile d'appeler tout un champ pour moi!).

Pour en savoir plus à ce sujet ici: http://www.mstechblogs.com/paul/?p=10385

 

</fin>

undefinedS'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin

Facile et rapide: Créer un Site SharePoint à l'aide de repos

Il y a beaucoup de ressources autour qui montrent comment procéder, mais je ne pouvais pas trouver un lien complet aller-à, Nous voici donc.

Vous pouvez créer un site SharePoint à l'aide de l'API REST.  Voici un exemple entièrement cuit:

<!--
    SiteRequestForm.html: Recueillir des informations et créer un site pour l'utilisateur.
-->

<Centre>
<table>
    <TR>
        <TD>Nom du site:</TD>
        <TD><entrée type= "texte" nom= SiteName"" ID= SiteName"" /></TD>
    </TR>
    <TR>
        <TD colspan= 2"">
            <entrée type= "submit" ID= "CreateSiteButton" valeur= "Créer le Site" />
        </TD>
    </TR>
</table>
</Centre>

<script SRC="../Plugins/jQuery-1.11.0.min.js"></script>

<script>
var CreateSiteLogicContainer = {

    createSiteData: {
            "paramètres": {
                __metadata: { type"": "SP.WebInfoCreationInformation" },
                URL: "Paultest1",
                Titre: "Paultest1",
                Description: "web rest-créé par Paul!",
                Langue: 1033,
                WebTemplate: « sts",
                UseUniquePermissions As Boolean: faux
            }
    },

    createSite: fonction () {

        jQuery.support.cors = True;

        CreateSiteLogicContainer.createSiteData.parameters.Url = $("#SiteName").Val();
        
        $.Ajax({
            URL: « https://bigapplesharepoint.sharepoint.com/NBAIADev/_api/web/webinfos/add",
            méthode: "POST",

            en-têtes: {
                "accepter": « application/json; OData = verbose",
                "content-type": « application/json;OData = verbose",
                « X-RequestDigest": $(« #__REQUESTDIGEST").Val()
            },

            données: JSON.stringify(CreateSiteLogicContainer.createSiteData),

            succès: fonction () { alerte("la réussite"); },
            erreur: fonction () { alerte("erreur"); }

        });
    },

    wireUpForm: fonction () {
        $("#CreateSiteButton").Cliquez sur(fonction () {
            alerte("Sur le point d'essayer et de créer le site.");
            CreateSiteLogicContainer.createSite();
        });
    }


}

CreateSiteLogicContainer.wireUpForm();

</script>

Lorsque réussie, vous obtenez un paquet JSON en réponse à ceci:

image

Mes pensées principales et les enseignements de cette comprennent:

  • Cette approche utilise jQuery.  Dans mon cas, ma bibliothèque jQuery est situé dans ".../ plugins. "  Vous aurez envie de changer cela pour pointer vers votre emplacement préféré de JQ.
  • Vous pouvez copier et coller cet extrait entier dans un composant WebPart éditeur de contenu sur une page, et il devrait fonctionner parfaitement.  Vous aurez envie de changer le point de fin de l'appel d'API et assurez-vous que vous référencez JQ correctement.
  • L'URL est relative à point de terminaison de l'API.  Dans mon cas, C'est créer des sous-sites sous https://bigapplesharepoint.com
  • Vous n'avez pas besoin de fournir une contenu-longueur. Certains blogs et MSDN document implique que vous faites, mais s'est passé pour moi automatiquement, qui je suppose est géré par l'appel de $.ajax lui-même.
  • Cette ligne est nécessaire pour éviter une réponse "interdite": « X-RequestDigest": $(« #__REQUESTDIGEST").Val().  Il existe d'autres façons de le faire, mais c'est assez agréable.  J'ai perdu le lien de blog qui a fourni ce raccourci.  H/T à vous, mystérieux blogueur!

Bonne chance et espérons que cela aide quelqu'un.

</fin>

undefinedS'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin

Surmonter un problème ennuyeux avec des URL relatives dans le lancement rapide de SharePoint

Je voulais ajouter un lien vers la navigation lancement rapide l'autre jour et m'a SharePoint:

image

Version texte pur qui est:

Assurez-vous que l'URL est valide et commence par soit un caractère valide (un signe dièse (#) ou oblique (/)) ou un protocole de prise en charge valable (par exemple, « http://’, « https://’, ' fichier://’, « ftp://’, « mailto:’, « nouvelles:’).

"Blech et pox!"J'ai dit.

Une solution de contournement consiste à utiliser JavaScript pour trouver un lien connu dans le lancement rapide et substituer son comportement.

Pour tester cette, Ajouter un nouveau lien à votre site de test thusly:

image

J'ai utilisé jQuery. Pour le résoudre, obtenir quelques JavaScript et jQuery sur la page à l'aide de votre technique préférée et avec une ligne de code suivante:

 

$(document).prêt( fonction () {

    $("un:contient(« Tester le remplacement de l'URL »)").Cliquez sur(fonction () { alerte("Cliquez sur changement de comportement!"); retour faux;});

});

Et ton oncle Bob.

Le sélecteur jQuery conclut chaque <un> balise qui a « Test URL de remplacement » dans son nom. Vous pouvez trouver-tune qui selon votre lien et autres.

Le .Cliquez(fonction() remplace tout ce qui l'aurait fait SharePoint lorsque l'utilisateur a cliqué. Assurez-vous que vous « retournez false » ou bien il va faire vos trucs et puis essayez de la chose href trop, qui n'est certainement pas votre but.

Cela a été fait et test dans un environnement en ligne de SharePoint mais doit travailler bien en 2010 et plus tôt aussi.

</fin>

undefinedS'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin

Simple et rapide: SharePoint reste appel seules déclarations 100 Comptes rendus

J'ai travaillé sur un site public face pour ma pratique de SharePoint ici dans New York et il utilise beaucoup d'appels JavaScript et reste pour afficher le contenu.

Au cours du développement de ligne principale, J'ai créer un petit groupe de données avec juste 10 ou alors rangées dans une liste personnalisée et mes appels reste tous tiré de là.  Une fois je suis tombé vers le haut de la liste d'avoir quelques centaines de lignes de données pour tester la croissance anticipée, J'ai trouvé que je voulais en venir exactement 100 lignes retournées retour sur mes appels reste.

Il s'agit d'une chose très simple à l'adresse.  Dans mon cas (et je crois que dans la plupart des cas), la valeur par défaut reste appelle à SharePoint (et peut-être comme un standard de l'industrie?) retour 100 lignes.  Pour retourner plus que la valeur par défaut, Utilisez le paramètre $top lors de votre appel, comme dans:

OBTENIR /Insights Dev/_api/web/lists/GetByTitle(« MockBlog »)/articles?$Sélectionnez = ID,Titre,Catégories/titre,Blog_x0020_Author/titre,DatePublished,BlogSummary&$Développez = Blog_x0020_Author,Catégories&$filtre =&$haut = 9999

J'ai pris 9999 dans ce cas car je sais que growth-wise, Il n'y aura plus de 200 ou alors les lignes ajoutées à cette liste en un an.  S'il devient disgracieux, Nous pouvons mettre en œuvre certains pagination vers le bas de la route.

</fin>

undefinedS'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin

Simple et rapide: Résoudre "paramètre d'URL non valide” problème avec UpdateListItems en lists.asmx

Lorsque vous travaillez avec UpdateListItems via lists.asmx, Il est facile de générer une erreur:

Paramètre d'URL non valide.

L'URL fournie contient une valeur ou une commande non valide. Veuillez vérifier de nouveau l'URL.

Vous pouvez obtenir cette erreur quand on oublie d'inclure l'ID dans la la liste des champs à mettre à jour.  Ce, comme beaucoup de ces SP services web, est un peu paradoxal étant donné que vous devez inclure l'ID dans l'attribut ID de la <Méthode> élément.  Et vous n'êtes pas mis à jour des ID et voulez probablement jamais en premier lieu.

Cette enveloppe SOAP fonctionne:

<soapenv:Enveloppe xmlns:soapenv =« http://schemas.xmlsoap.org/soap/envelope/'>
  <soapenv:Corps>                      
    <UpdateListItems xmlns =« http://schemas.Microsoft.com/SharePoint/SOAP/'>                     
      <nom de la liste>{C712E2EA-54E1-47AD-9D99-1848C7773E2F}</nom de la liste>                     
        <mises à jour>                     
         <Lot OnError ="Continuer">
          <Méthode ID =1"" Cmd =Mise à jour"">
            <Nom de champ ="CooperativeLock">verrouillé!</Champ>
            <Nom de champ =« CARTE D'IDENTITÉ">1</Champ>
          </Méthode>
        </Lot>                     
        </mises à jour>                
      </UpdateListItems>             
  </soapenv:Corps>         
</soapenv:Enveloppe>

Si vous supprimez la référence de champ ID puis vous obtiendrez le message « Paramètre URL invalide » ennuyeux.

</fin>

undefinedS'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin

 

Pauvre homme de mise en cache en JavaScript

[TL;DR version: utiliser des cookies pour stocker les résultats des appels asynchrones; restituer les résultats des dernières async appels immédiatement et puis validez-les après chargement de la page.]

J'ai travaillé sur le site intranet SharePoint pour un client qui dispose, entre autres choses, une navigation secondaire stylisée dont les options du menu sont gérées via une liste personnalisée vieux ordinaire.  L'idée est que le client obtient contrôler le menu de « leur » site sans affecter ou être affecté par le système mondial de navigation par elle.

(Il y a quelque chose d'incroyablement subversif sur l'ajout d'un CEWP qui pointe vers un fichier HTML qui charge des CSS et JS fondamentalement modifier presque tout sur le comportement d'un site... mais c'est pour un autre poste)

Le code pour cet jolie simple:

Le mal ici spot, c'est que chaque fois que quelqu'un frappe une des pages du site, navigateur web de l'utilisateur tend la main pour obtenir des éléments de la liste.  Lorsque dev est terminée et l'essai a prouvé des choses à être stable et complet, Cet appel n'est pas nécessaire plus de 99% du temps étant donné que le menu change rarement.  Il a aussi un effet bizarre de UI qui est commun dans ce nouveau monde de sites web hyper-ajaxy – rend la page et ensuite seulement le menu rend.  Il est nerveux et distrayant à mon avis.  Et de nervosité. Si, la mise en cache. 

J'ai modifié la logique thusly:

  • Recherchez un cookie dans le navigateur qui contient le menu, comme je l'ai lu dernière
    • Si trouvé, rendent immédiatement.  N'attendez pas la page pour terminer le chargement.  (Vous devez vous assurer que votre code HTML est stratégiquement placé ici, mais ce n'est pas difficile à faire).
  • Attendez que la page pour terminer le chargement et appeler un async pour charger les éléments de menu dans une liste à l'aide de repos ou lists.asmx ou autre
  • Comparer ce que j'ai contre le cookie
    • Si elle correspond, ARRÊT
    • Dans le cas contraire, à l'aide de jQuery, remplir dynamiquement un tas si <Li>les de dans un <UL>
  • Utiliser les CSS pour faire tout le formatage
  • Profit!

Certains d'entre vous vont dire, "Hé! Il n'y a aucune véritable cache passe ici puisque vous lisez le menu quand même à chaque fois.”  Et vous avez raison-je ne remets pas le serveur tout type de rupture.  Mais parce que l'appel est asynchrone et arrive après que la page initiale de la charge utile HTML rend pleinement, il « sent » plus réactif à l'utilisateur.  Le menu rend assez autant que dessine la page.  Si le menu arrive au changement, l'utilisateur est soumis à une re-dessiner de nervosité du menu, mais seulement qu'une fois.

Il existe des moyens pour accroître l'efficacité de cette mise en cache et dépanner le serveur en même temps:

  • Mettre dans une règle que le cache de « cookie » est valable pour un minimum de 24 heures ou quelques autres délais. Tant qu'il n'y a aucun cookie a expiré, Utilisez instantané menu du cookie et ne jamais frapper le serveur.

Eh bien... c'est tout ce qui viennent à l'esprit dès maintenant :). 

Si quelqu'un a des idées intelligentes ici je serais ravi de les connaître.

Et enfin, cette technique peut être utilisée pour d'autres trucs.  Page de ce client a un certain nombre de choses pilotés par les données sur les différentes pages, beaucoup d'entre eux changer relativement rarement (comme une fois par semaine ou une fois par mois).  Si vous ciblez des zones spécifiques de la fonctionnalité, vous pouvez donner une interface utilisateur plus réactive en extraient le contenu du magasin local de cookie et de rendre immédiatement.  Il se sent plus rapidement à l'utilisateur, même si vous n'enregistrez pas le serveur des cycles.  Vous peut sauver les cycles serveur en décidant sur certaines conditions et déclencheurs d'invalider ce cache de cookie local.  C'est tout situationnelle et artsy trucs et vraiment le plus amusant :). 

</fin>

undefinedS'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin

Comment: Configurer le Test unitaire et couverture de Test avec QUnit.js et Blanket.js pour un bureau 365 App de SharePoint

Intro

J'ai avez exploré les tests unitaires et testez couverture JavaScript comme je travaille sur une nouvelle application SharePoint pour SharePoint en ligne au bureau 365 suite.  Les chemins de recherche évidente m'a amené à QUnit.js et juste après que, À Blanket.js.

QUnit je voudrais mettre en place des tests unitaires et regroupez-les en modules.  Un module est juste une façon simple d'organiser des tests connexes. (Je ne suis pas sûr que je l'utilise comme prévu, mais ça marche pour moi jusqu'à maintenant avec le petit ensemble de tests, que j'ai défini à ce jour).

Blanket.js s'intègre avec Qunit et il va me montrer les lignes réelles de JavaScript qui étaient – et surtout – pas réellement exécutés au cours de l'exécution des tests.  Il s'agit d'une « couverture »-lignes exécutées sont couvertes par l'épreuve tandis que d'autres ne le sont pas.

Entre la mise en place de bonnes cas de test et la visualisation de couverture, Nous pouvons réduire le risque que notre code a des vices cachés.  Bons moments.

QUnit

En supposant que vous avez votre Visual Studio projet mis en place, Commencez par Télécharger le package de JavaScript de http://qunitjs.com.  Ajouter le JavaScript et CSS correspondant à votre solution.  Mine ressemble à ceci:

image

Figure 1

Comme vous pouvez le voir, J'utilisais 1.13.0 au moment où j'ai écrit ce billet de blog. N'oubliez pas de télécharger et ajouter le fichier CSS.

Que, sur le chemin, étape suivante consiste à créer une sorte d'atelier de test et les bits de Qunit de référence.  Je teste un tas de fonctions dans un fichier de script appelé « QuizUtil.js » donc j'ai créé une page HTML appelée « QuizUtil_test.html » comme indiqué:

image Figure 2

Voici le code:

<!DOCTYPE html>
<html xmlns= "http://www.w3.org/ 1999/xhtml">
<tête>
    <titre>Essai de QuizUtil avec Qunit</titre>
    <lien rel= "stylesheet" href="../CSS/QUnit-1.13.0.CSS" />
    <script type= text/javascript"" SRC="QuizUtil.js" données-couverture></script>
    <script type ="text/javascript" SRC =« qunit-1.13.0.js"></script>
    <script type ="text/javascript" SRC ="blanket.min.js"></script>

    <script>
        module("getIDFromLookup");
        test("QuizUtil getIDFromLookupField", fonction () {
            var goodValue = 1";#Paul Galvin";

            égal(getIDFromLookupField(goodValue) + 1, 2), "ID de [" + goodValue + "] + 1 devrait être 2";
            égal(getIDFromLookupField(indéfini), indéfini, "Undefined argument d'entrée doit retourner le résultat indéfini.");
            égal(getIDFromLookupField(""), indéfini, "Argument d'entrée vide doit retourner une valeur non définie.");
            égal(getIDFromLookupField(« gobbledigood3-thq;dkvn ada;skfja sdjfbvubvqrubqer0873407t534piutheqw;VN"), indéfini,« Doit toujours retourner une décapotable de résultat en un nombre entier");
            égal(getIDFromLookupField(2";#une autre personne"), 2"", « La vérification des [2;#une autre personne].");
            égal(getIDFromLookupField("9834524;#valeur de type long"), "9834524", « Test de grande valeur.");
            notEqual(getIDFromLookupField(5";#n'importe qui", 6), 6, "Tester un notEqual (5 n'est pas égal à 6 pour cet exemple: [5;#n'importe qui]");

        });

        module("htmlEscape");
        test("QuizUtil htmlEscape()", fonction () {
            égal(htmlEscape("<"), "&lt;", « Échapper un opérateur less than ('<')");
            égal(htmlEscape("<div class =  « someclass »>Certains texte</Div>"), "&lt;div class =&quot;SomeClass&quot;&gt;Certains texte&lt;/Div&gt;", "Chaîne de test plus complexe.");
        });

        module("getDateAsCaml");
        test("QuizUtil getDateAsCaml()", fonction () {
            égal(getDateAsCaml(Nouveau Date(« 31/12/2013")), « 2013-12-31 T:00:00:00", "Tests codés en dur date: [12/31/2013]");
            égal(getDateAsCaml(Nouveau Date("01/05/2014")), « 2014-01-05T:00:00:00", "Tests codés en dur date: [01/05/2014]");
            égal(getDateAsCaml(Nouveau Date("01/31/2014")), « 2014-01-31 T:00:00:00", "Tests codés en dur date: [01/31/2014]");
            égal(getTodayAsCaml(), getDateAsCaml(Nouveau Date()), "getTodayAsCaml() doit être égal à getDateAsCaml(nouvelle Date())");
            égal(getDateAsCaml(« valeur de non-sens"), indéfini, "Essayer d'obtenir la date d'une valeur de l'absurdité.");
            égal(getDateAsCaml(indéfini), indéfini, "Essayer d'obtenir la date de la [indéfini] Date.");
        });

        module("getParameterByName");
        test("QuizUtil getParameterByName (de la chaîne de requête)", fonction () {
            égal(getParameterByName(indéfini), indéfini, "Essayer d'obtenir non défini paramètre doit retourner non défini.");
            égal(getParameterByName("n'existe pas"), indéfini, "Essayer d'obtenir la valeur du paramètre quand on sait que le paramètre n'existe pas.");

        });

        module("Cookies");
        test(« QuizUtil diverses fonctions de cookie.", fonction () {
            égal(setCookie(« test", 1"", -1), getCookieValue(« test"), "Obtenir un cookie j'ai mis devrait fonctionner.");
            égal(setCookie("anycookie", 1"", -1), True, "Définissant une cuisson valide doit retourner à 'true'.");
            égal(setCookie("nom du cookie fou !@#$%"%\^&*(()?/><.,", 1"", -1), True, "Définir un nom de cookie mauvaise doit retourner"faux".");
            égal(setCookie(indéfini, 1"", -1), indéfini, "En passant pas défini comme nom de cookie.");
            égal(getCookieValue("n'existe pas"), "", « Cookie n'existe pas de test.");
        });

    </script>
</tête>
<corps>
    <Div ID= qunit""></Div>
    <Div ID= "qunit-luminaire"></Div>

</corps>
</html>

Il y a plusieurs choses qui se passe ici:

  1. Référencement de mon code (QuizUtil.js)
  2. Référencement Qunity.js
  3. Définition de certains modules (getIDFromLookup, Cookies, et d'autres)
  4. Placer un <Div> dont l'ID est « qunit ».

Puis, J'ai juste tirer vers le haut de cette page et vous obtenez quelque chose comme ça:

image

Figure 3

Si vous regardez dans la partie supérieure, vous avez quelques options, deux d'entre eux sont intéressants:

  • Masquer les tests passés: Assez évident.  Peut aider le œil il suffit de voir les zones à problèmes et pas beaucoup de fouillis.
  • Module: (déroulant): Ceci filtrera les tests vers le bas pour que les groupes de tests que vous voulez.

En ce qui concerne les tests eux-mêmes – quelques commentaires:

  • Il va sans dire que vous devez écrire votre code tel qu'il est testable en premier lieu.  À l'aide de l'outil peut aider à faire respecter cette discipline. Par exemple, J'ai eu une fonction appelée "getTodayAsCaml()”.  Ce n'est pas très testable puisque cela ne prend aucun argument d'entrée et de le tester pour l'égalité, Nous aurions besoin de constamment mettre à jour le code de test afin de tenir compte de la date du jour.  J'ai refait il par ajout d'un paramètre d'entrée de données, puis en passant la date actuelle quand je veux la date du jour en format CAML.
  • Le cadre Qunit documente ses propres tests, et il semble assez robuste.  Il peut faire des choses simples comme test d'égalité et possède aussi un support pour les appels de style ajax (les « vrais » ou moqué en utilisant votre mocker préféré).
  • Franchi les étapes également vous oblige à penser par cas – ce qui se passe avec « undefined » ou la valeur null est passée dans une fonction.  Il le rend simple tester ces scénarios sur.  Bonnes choses.

Couverture avec Blanket.js

Blanket.js complète Qunit en suivant les lignes réelles du code qui s'exécutent au cours de l'exécution de vos tests.  Il intègre droit dans Qunit donc, bien que c'est une application à part entière, Il joue bien : il semble vraiment que c'est une appli sans soudure.

Il s'agit de blanket.js en action:

image Figure 4

image

Figure 5

(Vous devez cliquer sur la case « Activer la couverture » en haut [Voir Figure 3] pour permettre cela.)

Les lignes en surbrillance sur la Figure 5 n'ont pas été exécutées par l'un de mes tests, J'ai donc besoin de concevoir un test qui provoque leur exécution si je veux une couverture complète.

Obtenir blanket.js en suivant ces étapes de travail:

  1. Télécharger à partir http://blanketjs.org/.
  2. Ajoutez-le à votre projet
  3. Mettre à jour votre page d'atelier de test (QuizUtil_test.html dans mon cas) comme suit:
    1. Le code de référence
    2. Décorez votre <script> référencer comme suit:
    <script type= text/javascript"" SRC="QuizUtil.js" données-couverture></script>

Blanket.js récupère l'attribut « données-couverture » et fait sa magie.  Il raccorde à Qunit, met à jour l'interface utilisateur pour ajouter l'option « Activer la protection » et voila!

Résumé (TL; DR)

Utilisez Qunit pour écrire vos scénarios de test.

  • Téléchargez-le
  • Ajoutez-le à votre projet
  • Écrire une page d'atelier de test
  • Créer vos tests
    • Refactoriser du code pour pouvoir être testée
    • Faire preuve de créativité!  Pensez à fou, scénarios impossibles des tester en tout cas.

Utilisez blanket.js pour assurer une couverture

  • Assurez-vous que Qunit fonctionne
  • Télécharger blanket.js et ajoutez-le à votre projet
  • Ajouter à votre page d'atelier de test:
    • Ajoutez une référence à blanket.js
    • Ajoutez un attribut « données-couverture » à votre <script> Tag
  • Exécuter vos tests de Qunit.

Jamais, j'ai fait tout cela avant et avait quelques trucs rudimentaire dans une poignée d'heures de travail. 

Essais heureux!

</fin>

undefinedS'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin

Le dernier costume que vous porterai jamais?

[Quick note – il s'agit d'un post assez long sur un emploi ouvrant pour mon groupe ici à New York et vous n'avez pas besoin de vivre dans la région des trois États, si vous êtes intéressé.]

J'ai rejoint Slalom Consulting sur 18 Il y a mois et que cela rend mon travail de plus longue durée depuis 2007. J'ai il n'a pas l'intention comme ça. Avant une série de sauts de travail qui a commencé avec mon saut dans le monde de SharePoint, J'étais à un seul endroit pour onze ans. J'ai enfin trouvé un nouveau, Enduring endroit à travailler pour le long terme ici au Slalom.

Cet endroit est de plus en plus et j'ai besoin d'aide pour contrôler que. Le type d'aide que j'ai besoin est généralement appelé un « architecte de Solutions SharePoint », bien que j'ai trouvé le mot architecte plus et/ou mal servir dans l'espace SharePoint pendant un bon moment maintenant. J'ai été aux prises sur la façon de blog à ce sujet. Je ne veux pas simplement la liste un tas de puces dans le style de dés/Monster. Mes pairs recrutement excellents ont fait ça déjà :). Si, J'ai décidé d'adopter une approche « day in the life ». Lisez-la et examiner:

1) Si elle fait appel et

2) Si vous connaissez dans votre OS que vous pouvez le faire.

Si oui, Contactez-moi (Paul.Galvin@slalom.com) et Let's talk.

Voici ce que vous pouvez vous attendre à faire en semaine/mois type comme un architecte de solutions dans mon équipe:

  • Exécuter des projets, souvent plus d'un à la fois. Certains projets sont grands et donc vous détiendrait qu'un projet. « Exécution » d'un projet signifie que vous avez à la surveillance et la responsabilité de la qualité de la prestation. Dans presque tous les cas, vous aurez un PM et une très forte équipe de devs, BAs, Gens UX, etc.., pour vous soutenir. Mais vous serez la face principale, que le client voit, fiducies, etc.. Il n'y a pas se cacher dans l'ombre dans ce rôle :). Vous allez facturer cette fois et l'objectif est de vous tenir assez occupé de le faire 80 % du temps.
  • Aider à la paperasserie – truies, Appels d'offres, ponts – tout ce que de bonnes choses. Je pense que nous avons notre processus de truie assez serré et solide est assez stéréotypé. Si vous êtes habitué à écrire des truies aujourd'hui, notre processus ne va pas être un défi pour vous. DP – ce sont un peu plus difficiles. Ils ont tendance à être sur mesure dans un premier temps dans la nature et DP généralement tirer dans plusieurs auteurs différents. Il est bon et mauvais, mais surtout bon. Cela peut devenir scrambly lorsque nous avons besoin de jongler avec la nécessité pour l'excellent service client alors qu'il tentait également de gagner de nouveaux travaux. Vous ne possédez pas probablement un appel d'offres, mais on vous demandera de contribuer des sections.
  • Visites de vente, mais pas plus près. Au cours d'un mois, vous pouvez vous attendre à passer quelques appels de vente avec notre équipe des ventes. Vous serez le PME dans la chambre, prendre des notes et d'aider à façonner la solution. Cependant, vous ne pas être demandé ou doit gérer le cycle de vente de bout en bout. Vous n'avez pas besoin de "vendre,"vous avez juste besoin d'être la voix calme de raison expert dans la chambre. Ceci génère la confiance et c'est pourquoi vous êtes là. Bien sûr, Si vous aimez la vente, puis, il y a place pour vous à grandir ici aussi.
  • Aider à recruter. Nous avons une sorte de programme de référence, donc si vous savez vraiment des gens solides dans la communauté que vous pensez que devraient faire partie du Slalom, vous pouvez bénéficier de cette façon. Nous avons consacré des recruteurs (qui sont excellents) faire la part du lion de ce genre de travail. L'aide réelle est une entrevue avec les candidats – ils sont un bon ajustement sur le plan culturel? Ne savent-ils pas leurs trucs? Peuvent-ils faire * ma * vie plus facile? 🙂 Cela vient par à-coups, une ou deux fois par mois, Bien que dans quelques mois vous ferais pas du tout.
  • Aider à définir les meilleures pratiques, construire notre IP et nous rendre plus compétitifs sur le marché. Vous êtes une mec expérimentée/gal. Vous avez été autour du bloc – non seulement dans SharePoint, mais vous avez l'expérience dans d'autres technologies et vécu de bonnes et mauvaises (même terrible) projets partout. Comme un résultat, vous savez ce qui fonctionne et ce qui ne fonctionne pas. Nous aurez envie de vous faire partager cette expérience avec nous sur une base quotidienne dans un sens tactique (i.e. vraiment bien fonctionner vos projets) mais aussi stratégiquement. « Best practices » sont un peu galvaudés comme terme et j'hésite à l'utiliser. L'idée de base est que vous venez tant qu'une personne expérimentée ayant une expérience profonde et pertinente et nous voulons intégrer le meilleur de vos apprentissages dans comment nous engager avec les clients sur une base quotidienne.
  • Amusez-vous – Nous sommes un groupe très intégré. Je veux éviter une platitude, mais c'est vraiment apt dans ce cas – nous travaillons dur (en quelque sorte) et nous jouons encore plus fort :). Il y a une sorte de Aaron Sorkin de plaisanteries ici, la salle est toujours pleine de gens intelligents, Nous aimons notre boisson et nous organisons un bon nombre d'amusement événements – soirée cinéma, voyages de baseball (même s'ils sont horrible, équipes pratiquement maléfiques).

Si je pouvais résumer le tout dans un mot, Je voudrais utiliser le mot « leadership ». Piloter des projets, jouer un rôle prépondérant dans le bâtiment sur la pratique (IP, Constitution de l'équipe), etc..

Mais attendre! Il n'y a plus! Sinon, pourquoi travailler au Slalom?

  • Remarquable unité d'intention – tout le monde veut grandir cette chose dehors. « Cette chose » est le Bureau de New York. Tout le monde est à bord avec ce.
  • Le vent dans vos voiles – sœur bureaux, sœur pratiques – Slalom est un organisation de consultation « full service ». Je dirige le cabinet de SharePoint (une « pratique zone tête » dans le jargon du Slalom). J'ai soeur pratiques à 11 autres bureaux de Slalom. Donc même si je suis le roi que SharePoint s'inquiète ici Slalom New York, J'ai des pratiques par les pairs à Chicago, Seattle, Dallas, Atlanta, Boston, etc.. d'où je peux dessiner sur le soutien. C'est vraiment le meilleur des deux mondes – autonomie importante ici à New York, mais l'accès à des tonnes de talent au sein de l'Organisation.
  • Vent de vos ventes (2) – Nous faisons plus que SharePoint – beaucoup plus. Nous faisons BI, CRM, UX, Conseil aux entreprises, Mobile, développement personnalisé et autres. Nous sommes bons pour Croix de vente entre nous et nous sommes bien à la peinture – et surtout, livraison sur – une image « full service » pour nos clients. Cela est particulièrement attrayant pour moi. J'ai séjourné dans nombreuses orgs petits travaillant sur SharePoint concerts et frustré maintes et maintes fois, parce que nous étions pigeon perforé « peuple SharePoint ». Cela n'arrive pas avec Slalom et nous arrivons à faire un travail plus intéressant ainsi.
  • Modèle local – aucun voyage.
  • Croissance à long terme – Slalom dure gangbusters. Beaucoup de stabilité et de croissance. Croissance signifie également que nous avons besoin d'embaucher des dirigeants aujourd'hui à la tête de nouvelles équipes que nous ajoutons plus de clients et de personnel pour prendre en charge les clients.

Je pourrais continuer, mais j'ai probablement déjà que trop duré. Je pense que j'ai capturé l'essence ici. Si vous songez à l'évolution des emplois et cela semble bon pour vous, Let's talk.

Si vous êtes satisfait de votre emploi actuel – parlons quand même :). J'ai été dans beaucoup d'endroits et a été très « heureux » dans le temps. Slalom est différent et j'apprécierais beaucoup une chance de vous convaincre de cela.

</fin>

undefinedS'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin

Facile et rapide: Définir la taille d'un éléments dans une zone de liste dans une application Windows Store

Je crée dans une application Windows Store..., Je veux montrer à l'utilisateur des messages d'information diverses.  J'ai pris un ListBox comme outil pour le montrer afin qu'ils peuvent défiler à travers eux et tout ce que de bonnes choses. 

Les messages sont uniquement à but informations, Il n'y a donc pas lieu de prévoir tout ce supplément espace blanc autour d'eux car l'utilisateur peut les sélectionner jamais pour quoi que ce soit.  Le comportement par défaut du contrôle ListBox fournit une quantité importante de rembourrage et je voulais me débarrasser de celui-ci.  Eh bien.... vous ne pouvez pas faire ce genre de chose sur la zone de liste directement.  CEPENDANT, vous pouvez le faire pour les éléments que vous ajouter:

        privé VOID AddGameStateLogMessage(chaîne Lemessage)
        {
            TextBox t = Nouveau TextBox();
            t.Text = GameStateCounter    + ": " + Lemessage;
            t.TextWrapping = TextWrapping.Wrap;
            t.MinWidth = 400;
            Épaisseur thisPadding = Nouveau Épaisseur(5, 0, 5, 0);
            t.Padding = thisPadding;
            t.FontSize = 12;

            ListBoxItem li = Nouveau ListBoxItem();
            néantContent = t;
            Li.MaxHeight = 25;
            thisPadding = Nouveau Épaisseur(5, 0, 5, 0);
            Li.Rembourrage = thisPadding;

            GameStateLog.Items.Insert(0,Li);
        }

dans ce qui précède, Je suis créant une zone de texte et en définissant ses polices, son rembourrage, etc..

Prochaine, J'ai créer un ListBoxItem et définissez son contenu à la zone de texte mis en forme.

Enfin, J'insère le ListBoxItem dans le ListBox.  (Je veux montrer les messages plus récents en haut de la liste, C'est pourquoi l'Insert(0,Li) au lieu d'un simple Add() invocation.).

Je va être peaufiner cela un peu avant que je suis vraiment heureux avec le comportement du contrôle ListBox, mais le modèle illustré ci-dessus a été très fructueux.  J'espère que quelqu'un d'autre estime qu'il est utile.

</fin>

undefinedS'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin